2017-06-08 21 views
1

ファイルから複数のバイト配列を読み取るにはどうすればよいですか?これらのバイト配列はイメージであり、大きな可能性があります。ファイルから複数のバイト配列を読み取る

using (var stream = new FileStream(tempFile, FileMode.Append)) 
     { 
     //convertedImage = one byte array 
     stream.Write(convertedImage, 0, convertedImage.Length); 
     } 

だから、今、彼らはtempFileにいると、私は個々のアレイとしてそれらを取得する方法がわからない:

は、これは私がファイルに追加している方法です。理想的には、私はそれらをIEnumerable<byte[]>として入手したいと思います。これらを分割する方法はありますか?

+2

これらは取得できません。読み込むバイト数はわかりません。コードを修正し、最低でもまずconvertedImage.Lengthを書き込む必要があります。 –

+2

分割する場所はどのように分かりますか?ファイルそのものに利用可能な情報がないようです。 – Evk

+0

@HansPassant ...それは私が恐れていたことです。どこで分割するのですか?あなたの2番目の文を詳しく教えてください。私が手動で各イメージのために読むためにバイトを設定できるならば、それは実行可能です。 –

答えて

2

複数のバイト配列を取得するには、読み込み時の長さを知る必要があります。保存されているすべての画像が同じサイズであればデータを読み込み

using (var stream = new FileStream(tempFile, FileMode.Append)) 
{ 
    //convertedImage = one byte array 
    // All ints are 4-bytes 
    stream.Write(BitConverter.GetBytes(convertedImage.Length), 0, 4); 
    // now, we can write the buffer 
    stream.Write(convertedImage, 0, convertedImage.Length); 
} 

が、その後、

using (var stream = new FileStream(tempFile, FileMode.Open)) 
{ 
    // loop until we can't read any more 
    while (true) 
    { 
     byte[] convertedImage; 
     // All ints are 4-bytes 
     int size; 
     byte[] sizeBytes = new byte[4]; 
     // Read size 
     int numRead = stream.Read(sizeBytes, 0, 4); 
     if (numRead <= 0) { 
      break; 
     } 
     // Convert to int 
     size = BitConverter.ToInt32(sizeBytes, 0); 
     // Allocate the buffer 
     convertedImage = new byte[size]; 
     stream.Read(convertedImage, 0, size); 
     // Do what you will with the array 
     listOfArrays.Add(convertedImage); 
    } // end while 
} 

です:この(あなたが書くコードを変更することができる場合)の長さの値を追加することで操作を行うための最も簡単な方法最初の読み書き呼び出しをそれぞれから取り除くことができ、sizeを配列のサイズにハードコードすることができます。

+0

有望に見えますが、データの読み取りは、750kbファイルでは分単位では非常に遅いです。 –

+0

そのファイルに含まれる配列の数を教えてください。また、実行中にタスクマネージャを見ると、ディスク使用量はどのくらいですか? CPU使用率はどうですか? – James

+0

7つの配列/画像があります。 CPUはそのプロセスで35%(全体で45%)、ディスクで0%です。 –

1

読み返してみると、イメージ/バイト配列あたりのバイト数がどのようになるのですか?あなたはあまりにも長さを格納する必要が

(すなわち、最初の4つのバイトは=データバイトに続く32ビット整数のバイト数を、符号化された。)

、リードバック最初の4つのバイトを読み取り、それを未符号化しますintに戻って、そのバイト数を読み、eofまで繰り返す。

2

個々の配列で取られたバイト数を、これらのバイト自体から除外することができない限り、イメージの数と個々の長さをファイルに格納する必要があります。

これにはさまざまな方法があります。個々の配列の長さを各バイト配列の前に書き込むことも、 "ペイロード"データをファイルに書き込む前に残りの内容を記述する "ヘッダ"を書くこともできます。次のように

ヘッダーが見えることがあります。

Byte offset Description 
----------- ------------------- 
0000...0003 - Number of files, N 
0004...000C - Length of file 1 
000D...0014 - Length of file 2 
... 
XXXX...XXXX - Length of file N 
XXXX...XXXX - Content of file 1 
XXXX...XXXX - Content of file 2 
... 
XXXX...XXXX - Content of file N 

あなたがヘッダに書き込まれるバイト配列を生成するためにBitConverterメソッドを使用することができ、またはあなたがBinaryWriterを使用することができます。

関連する問題