Я пишу программу, которая загружает и извлекает файлы из архива. В настоящее время с моим кодом он успешно извлекает один из архивов, в котором я нуждаюсь, и с архивом проблем он читает и извлекает 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 файлов и еще один небольшой архив без проблем.
Я бы рекомендовал для чтения/поиска формат файла. В некоторых/всех файлах могут быть байты заполнения или некоторые другие дополнительные данные. –
Это проприетарный формат, любая спецификация формата будет частной, если она все еще существует. 12 байтов, которые не читаются, являются частью данных. 08 00 00 00 означает 8 байтов для чтения, а остальные 8 - данные. Я действительно ценю это предложение, но это была хорошая идея. –