我正在編寫一個正在加載和從檔案中提取文件的程序。目前使用我的代碼,它正在成功提取我需要的一個歸檔文件,並且使用問題歸檔文件,它在發出異常之前讀取並提取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個文件和另一個沒有問題的小檔案。
我推薦閱讀/發現文件格式規範。某些/所有文件中可能有填充字節或其他額外數據。 –
這是一種專有格式,任何格式規範都是私有的,如果它仍然存在的話。 未讀取的12個字節是數據的一部分。 08 00 00 00表示要讀取8個字節,其餘8個是數據。不過,我真的很欣賞這個建議,這是一個好主意。 –