我想讀\寫它具有以下結構的二進制文件:讀寫結構化二進制文件
該文件由「記錄」組成。每個 「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。提前致謝。
FileStream具有控制緩衝區大小的構造函數參數。另一件要考慮的事是操作系統本身也有緩衝。 –
@JamesJohnston:確實。我希望大多數情況下的默認值都可以。我懷疑這確實是個問題。 –
我同意。雖然我遇到了一個例外情況,儘管沒有使用C#。我使用的C運行時默認爲一個512字節的緩衝區。因此,當一次讀取數據文件4個字節時(我們的程序所做的),磁盤性能會非常慢。當然,這通常不是問題,因爲即使程序沒有做足夠的工作,操作系統也會緩衝讀取。 –