2015-12-29 11 views
0

Я пишу программу, которая загружает и извлекает файлы из архива. В настоящее время с моим кодом он успешно извлекает один из архивов, в котором я нуждаюсь, и с архивом проблем он читает и извлекает 6 файлов, прежде чем давать исключение.BinaryReader Misalignment - Не считывание правильного количества байтов

Исключение состоит в том, что оно считывает неправильное целое число, вместо этого оно считывает целое число 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 байт заголовка, который не используется (но я поставил к local для потенциальных проверок валидности, потому что это значение всегда должно быть одинаковым), затем 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); 
}