2010-11-26 29 views
0

私はバイト配列のコレクションに読んでいるバイナリファイルを持っています。バイナリファイルをバイト配列に読み込む方法は?

ファイルには、複数(任意の数)のレコードが含まれています。基本的にバイトのブロック。各レコードは任意の長さです。

ファイルのヘッダには、各レコードのオフセットを提供します。

record 0: offset 2892 
record 1: offset 4849 
.... 
record 98: offset 328932 
record 99: offset 338498 

ループを実行し、各レコードをバイト配列に読み込むコードを記述しました。オフセットの違いを見ると、レコードサイズがわかります。オフセットのシークとReadBytes()への呼び出しは、レコードをその配列に読み込みます。

私の現在の不完全な解決策は、最後のレコードのために動作しません。あなたはその最後のレコードをどのように配列に読み込みますか(それは任意の長さであることに注意してください)。

なぜですか?各レコードは暗号化されており、別々に解読する必要があります。私はバイト配列に各レコードを読むコードを書いています。それを解読し、すべてのレコードをファイルに書き戻します。

コードは、要求に応じて追加:

//recordOffsets contain byte location of each record start. All headers (other than universal header) are contained within record 0. 
    recordBlocks = new List<RecordBlock>(); 

    //store all recordOffsets. Record0 offset will be used to load rest of headers. Remaining are used to parse text of eBook. 
    for (int i = 0; i < standardHeader.numRecs; i++) 
    { 
     RecordBlock r = new RecordBlock(); 
     r.offset = bookReader.ReadInt32(EndianReader.Endian.BigEndian); 
     r.number = bookReader.ReadInt32(EndianReader.Endian.BigEndian); 
     recordBlocks.Add(r); 
    } 

    foreach (RecordBlock r in recordBlocks) 
    { 
     if (r.number == recordBlocks.Count) 
     { 
      ///deal with last record 
     } 
     else 
     { 
      r.size = recordBlocks[(r.number) + 1].offset - r.offset; 
     } 
     bookReader.Seek(r.offset, SeekOrigin.Begin); 
     r.data = bookReader.ReadBytes(r.size);    
    } 
+0

コードを投稿してください。 – TalentTuner

+0

これまでのコードを表示できますか? – Aamir

答えて

3

あなたにも最後のレコードのバイトの量を計算することができるようにあなたは、バイトの合計数を決定するためのFileInfoクラスからのLengthプロパティを使用することができます。
あなたは現在のロジックの大部分を保つことができます。

+0

私はそれを試みます。もしそうでなければ、私はAamirを "壊す"方法を試みます。私はバイト配列を出力するReadToEndメソッドのようなものがあることを期待していました。 –

+0

ビンゴ。あなたが私にそれについて考えさせたら、実際に実装するのは簡単でした。上のifブロックの中に一対の行を追加しました。私は後でコードをクリーンアップするためにそれをリファクタリングします(ファイルサイズを早く取得する)。 FileInfo f =新しいFileInfo(inFile); r.size =(int)f.Length - r.offset; –

5

System.IO.File.ReadAllBytes()は、バイト配列内のすべてのバイトを読み取り、そのあとは記録することによって、そのバイト配列記録から読み取ることができます。

+0

ええ、私はそれを検討していた。私は1つの「マスター配列」を読み込み、一連のコピーを使用してレコードに分割します。 –

0

私は、.NETの男ではないんだけど、あなたがカップルのオプションを持っていると思われます。ファイルのサイズを伝える方法があるはずです。あなたがそれを見つけることができれば、あなたはすべてを読むことができます。 binaryreader.readbytes()のmsdnの記述では、ストリームに含まれるファイルよりもmroeを要求すると、ファイルに含まれるものがすべて取得されます。あなたが読んでいるBLOBの最大サイズを知っていますか?もしそうなら、それをあらかじめクリアされたメモリに読み込んでください。私には思える

1

あなたの問題はどのようにあなたが最後のレコードの実際のレコードサイズを取得しますです。

どちらかあなたはあなたのコードが私の考えでは魅力のように動作します明示的にヘッダーにこの情報を追加することがあります。

+0

私はファイルのレイアウトを管理していない、私は質問から明らかではないと思う。私ができるならば、私がファイルで変更することがたくさんあることを信じてください。 –

+0

:)、ハァッ問題、私は何かを考えさせてください – TalentTuner

+0

Aamirの解決策はうそつきそうです、私はあなたがそれを試してみるべきだと思います。 – TalentTuner

関連する問題