2010-11-26 144 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 2010-11-26 05:11:36

+0

到目前爲止您能向我們展示您的代碼嗎? – Aamir 2010-11-26 05:11:47

回答

3

您可以使用FileInfo類中的Length屬性來確定總字節數,以便您還可以計算最後一條記錄的字節數。
因此,您可以保留大部分當前邏輯。

+0

我會嘗試。如果沒有,我會嘗試阿米爾「打破它」的方法。我只是希望有一個像ReadToEnd方法那樣可以輸出一個字節數組。 – 2010-11-26 05:18:43

5

System.IO.File.ReadAllBytes()將讀取字節數組的所有字節之後,你可以從記錄中的字節數組記錄中讀取。

+0

是的,我正在考慮這一點。我會讀入一個「主數組」,然後使用一系列副本將其分解成記錄。 – 2010-11-26 05:16:29

0

我不是一個.net的傢伙,但它似乎你有幾個選項。必須有一種方法來確定文件的大小。如果你能找到,你可以閱讀所有內容。或者,binaryreader.readbytes()的msdn描述表明,如果你要求mroe而不是流包含,你會得到文件中的內容。你知道你正在閱讀的blob的最大尺寸嗎?如果是這樣,只需將其讀入預先清除的內存。

1

你的問題在我看來是你將如何獲得最後一個記錄的實際記錄大小。

要麼你可以明確地將這些信息添加到標題中,那麼你的代碼將在我的想法中充當魅力。

相關問題