2011-11-04 480 views
2

我想讀\寫它具有以下結構的二進制文件:讀寫結構化二進制文件

enter image description here

該文件由「記錄」組成。每個 「RECORD」 具有以下結構: 我將使用第一記錄如實施例

  • (紅色)START字節:0x5A(始終爲1字節,固定值0x5A)
  • (綠色)LENGTH字節:0×00 0x16(始終爲2個字節,值可以從 「0x00 0x02」變爲「0xFF 0xFF」)
  • (藍色)內容:LENGTH字段減號2的十進制值指示的字節數。在這種情況下,LENGHT字段值爲22(0x00 0x16轉換爲十進制),因此CONTENT將包含20(22 - 2)個字節。

我的目標是逐條讀取每條記錄,並將其寫入輸出文件。 其實我有讀取功能和寫入功能(僞代碼):

private void Read(BinaryReader binaryReader, BinaryWriter binaryWriter) 
{ 
    byte START = 0x5A; 
    int decimalLenght = 0; 
    byte[] content = null; 
    byte[] length = new byte[2]; 

    while (binaryReader.PeekChar() != -1) 
    { 
     //Check the first byte which should be equals to 0x5A 
     if (binaryReader.ReadByte() != START) 
     { 
      throw new Exception("0x5A Expected"); 
     } 

     //Extract the length field value 
     length = binaryReader.ReadBytes(2); 

     //Convert the length field to decimal 
     int decimalLenght = GetLength(length); 

     //Extract the content field value 
     content = binaryReader.ReadBytes(decimalLenght - 2); 

     //DO WORK 
     //modifying the content 

     //Writing the record 
     Write(binaryWriter, content, length, START); 
    } 
} 

private void Write(BinaryWriter binaryWriter, byte[] content, byte[] length, byte START) 
{ 
    binaryWriter.Write(START); 
    binaryWriter.Write(length); 
    binaryWriter.Write(content); 
} 

這種方式實際上是工作。 但是,由於我處理的文件非常大,我發現它根本沒有執行,導致我讀寫3次記錄。其實我想讀取數據的錯誤塊,而不是少量的字節,也許在內存中工作,但我使用Stream的經驗停止與BinaryReader和BinaryWriter。提前致謝。

回答

2

FileStream已經被緩衝,所以我想預計它工作得很好。如果你真的需要,你總是可以在原始流的周圍創建一個BufferedStream以增加額外的緩衝,但是我懷疑它會產生顯着的差異。

你說這是「沒有表現」 - 多快它工作?你有多確定IO是你的時間?你有沒有執行任何代碼分析?

+0

FileStream具有控制緩衝區大小的構造函數參數。另一件要考慮的事是操作系統本身也有緩衝。 –

+0

@JamesJohnston:確實。我希望大多數情況下的默認值都可以。我懷疑這確實是個問題。 –

+0

我同意。雖然我遇到了一個例外情況,儘管沒有使用C#。我使用的C運行時默認爲一個512字節的緩衝區。因此,當一次讀取數據文件4個字節時(我們的程序所做的),磁盤性能會非常慢。當然,這通常不是問題,因爲即使程序沒有做足夠的工作,操作系統也會緩衝讀取。 –

1

我可能還建議您最初讀取3(或6?)個字節,而不是2個單獨的讀取。將最初的字節放在一個小數組中,檢查5a ck字節,然後檢查2字節長度指示符,然後3字節AFP操作碼THEN讀取AFP記錄的其餘部分。

這是一個小的差異,但它擺脫了你的一個閱讀電話。

我不是喬恩斯基特,但我在全國最大的印刷&郵件商店相當長的一段人做的工作,我們也大多AFP輸出:-)

(通常是C,雖然)