2011-01-25 12 views
0

私はファイルを読み込み、2ブロックのデータを抽出しようとしています。ブロック1とブロック2は、ファイルに多数のデータブロックが含まれているファイルから呼び出します。両方のブロックは、バイト配列で返される である必要があります。ブロック1は、ファイル内のどこかで開始され、行の先頭には "block1:"と続き、読み取るバイト数が続きます。ブロック2は、必ずしも block1の後に出現するとは限らないが、ファイル内で「block2:」が始まり、次に読み取るバイト数が で始まる場所で始まります。私は最高で.Net 3.5に制限されています。ファイルからバイト配列を抽出する

答えて

0

あなたはFile.ReadAllBytesを使用すると、あなたは彼らがしているインデックスを知っていればArray.Copyオーバーロードのいずれかを使用して返さbyte[]からあなたのブロックを抽出することができます。

+0

残念ながら、それらのインデックスはわかりません。 –

+0

@Ray Bass - ブロックについて何を知っていますか?あなたはあなたの質問に本当に情報を提供していませんでした。それを編集して関連情報を追加して、人々が役に立つ回答を得られるようにしてください。 – Oded

0

をお使いのファイルのヘッダー情報の任意の並べ替えがなければ、あなたがする必要がありますファイル全体をスキャンし、block1:またはblock2:のマーカーを検索します。

更新:

は、ここではこれを行うだろうかのサンプル(必ずしも最適な実装)です:あなたがする必要がありますヘッダー情報なしで、他の人のよう

byte[] GetBlockOfData(string fileName, string blockName) 
{ 
    var allBytes = File.ReadAllBytes(fileName); 
    // Assuming block names are ASCII-encoded 
    var blockMarker = Encoding.ASCII.GetBytes(blockName + ":"); 

    // Scan for the first byte of the marker 
    for (var i = 0; i < allBytes.Length; i++) 
    { 
     if (allBytes[i] == blockMarker[i]) 
     { 
      // See if this is the entire marker 
      var isMatch == true; 
      for (var j = 0; j < blockMarker.Length; j++) 
      { 
       if (allBytes[i + j] != blockMarker[j]) 
       { 
        isMatch = false; 
        break; 
       } 
      } 
      if (isMatch) 
      { 
       // Assuming it's a byte... 
       var blockLength = allBytes[i + blockMarker.Length]; 
       var result = new byte[blockLength]; 
       Array.Copy(
        allBytes, i + blockMarker.Length + 1, result, 0, 
        blockLength); 
       return result; 
      } 
     } 
    } 
    return null; 
} 
+0

返信いただきありがとうございます。同意する。これがどのように行われるかを示すサンプルコードがありますか? –

+0

私の更新を参照してください。このコードではいくつかの前提がありますので、コメントを確認してください。 – Jacob

0

を言及しています少なくとも、あなたの「ブロック」マーカーを探している何らかのフィルタを使って、ファイルの内容をストリームします。

あなたはヘッダ情報を持っている場合(あるいはどこかのブロックマーカーのオフセットに、少なくともいくつかの情報)は、メモリマップドファイルを使用することができます。

これは、.NET 4.0が必要です

http://www.developer.com/net/article.php/3828586/Using-Memory-Mapped-Files-in-NET-40.htm

、 .NET 4を使用していない場合でもWin32 APIを使用することができます。

+0

私は最高で.Net 3.5に制限されています。 Win32 APIを使用してこれがどのように行われるか、サンプルコードはありますか? –

関連する問題