2015-12-29 25 views
0

我正在編寫一個正在加載和從檔案中提取文件的程序。目前使用我的代碼,它正在成功提取我需要的一個歸檔文件,並且使用問題歸檔文件,它在發出異常之前讀取並提取6個文件。BinaryReader未對齊 - 沒有讀取正確的字節數

這是一個例外,因爲它正在讀取錯誤的整數,而是讀取它應該讀取的整數之前的整數12個字節。

這裏是我的代碼:

if (versionNumber.Equals("AULB")) 
{ 
    fileCount = binReader1.ReadInt32(); 

    for (int i = 0; i < fileCount; i++) 
    { 
     int size = binReader1.ReadInt32(); 
     String midValues = "" + binReader1.ReadInt64(); 
     int nameLength = binReader1.ReadInt32(); 

     String name = 
      System.Text.Encoding.Default.GetString(binReader1.ReadBytes(nameLength)); 

     byte[] blueprint = binReader1.ReadBytes((size) - 12 - nameLength); 

     //Export blueprint for testing 
     MemoryStream blueprintStream = new MemoryStream(blueprint); 
     FileStream fileStream1 = new FileStream(
      "C:\\Users\\Dan\\Desktop\\blueprints\\" + i + ".blueprint", 
      FileMode.Create, FileAccess.Write); 
     blueprintStream.WriteTo(fileStream1); 
    } 

作爲一個快速的解釋中,讀取4個字節來獲取文件的大小,8個字節是未使用的報頭的(但我已經設置爲本地進行潛在的有效性檢查,因爲這個值應該始終相同),然後4個字節來獲取字符串名稱的長度,然後讀取那麼多字節來獲取名稱。

之後,它抓取文件的其餘數據,所以我減去名稱的長度,字符串長度和額外的8個字節,因爲它已經讀取它們。

爲了說明我想加載的內容,這裏是二進制數據。我用淺藍色突出顯示了文件大小,淺綠色是額外的8個字節,亮綠色是字符串長度,然後是粉紅色字符串。

我也強調在讀取我的程序試圖閱讀的字節,認爲它是文件大小。

我不太清楚可能會導致這個問題,因爲它讀取前6個文件和另一個沒有問題的小檔案。

The file I'm loading.

+0

我推薦閱讀/發現文件格式規範。某些/所有文件中可能有填充字節或其他額外數據。 –

+0

這是一種專有格式,任何格式規範都是私有的,如果它仍然存在的話。 未讀取的12個字節是數據的一部分。 08 00 00 00表示要讀取8個字節,其餘8個是數據。不過,我真的很欣賞這個建議,這是一個好主意。 –

回答

0

奇怪的是,那給了我很奇怪值是沒有意義的它讀取文件測試一個字符串後,我試圖強制程序來讀取12個額外的字節,當它到達了第6文件,現在它正確讀取字節。

這是非常奇怪的,因爲我試圖讀取前面的字節,他們的價值讓我回到了不存在的文件。

無論採用哪種方式,這都是爲我修復它的代碼。這是一個非常簡單的解決方法。

if (i != 6) 
{ 
    blueprint = binReader1.ReadBytes((size) - 12 - nameLength); 
} else { 
    blueprint = binReader1.ReadBytes((size) - 12 - nameLength + 12); 
}