Как прочитать двоичный файл в массив байтов? - PullRequest
1 голос
/ 26 ноября 2010

У меня есть двоичный файл, который я читаю в коллекцию байтовых массивов.

Файл содержит несколько (произвольное количество) записей. По сути блок байтов. Каждая запись имеет произвольную длину.

В заголовке файла указаны смещения каждой записи.

record 0: offset 2892
record 1: offset 4849
....
record 98: offset 328932
record 99: offset 338498

Я написал код для выполнения цикла и чтения в каждой записи в его байтовый массив. Глядя на разницу в смещениях, я получаю рекордный размер. Поиск смещения, а затем вызов ReadBytes () считывает запись в ее массив.

Мое текущее неполное решение не будет работать для последней записи. Как бы вы прочитали эту последнюю запись в массив (помните, что она произвольной длины).

А почему? Каждая запись зашифрована и должна быть расшифрована отдельно. Я пишу код, который будет читать в каждой записи в байтовом массиве. Расшифруйте его, а затем запишите всю запись обратно в файл.

Код добавлен по запросу:

    //recordOffsets contain byte location of each record start.  All headers (other than universal header) are contained within record 0.
    recordBlocks = new List<RecordBlock>();

    //store all recordOffsets.  Record0 offset will be used to load rest of headers.  Remaining are used to parse text of eBook.
    for (int i = 0; i < standardHeader.numRecs; i++)
    {
        RecordBlock r = new RecordBlock();
        r.offset = bookReader.ReadInt32(EndianReader.Endian.BigEndian);
        r.number = bookReader.ReadInt32(EndianReader.Endian.BigEndian);
        recordBlocks.Add(r);
    }

    foreach (RecordBlock r in recordBlocks)
    {
        if (r.number  == recordBlocks.Count)
        {
            ///deal with last record
        }
        else
        {
            r.size = recordBlocks[(r.number) + 1].offset - r.offset;   
        }
        bookReader.Seek(r.offset, SeekOrigin.Begin);
        r.data = bookReader.ReadBytes(r.size);            
    }

Ответы [ 4 ]

6 голосов
/ 26 ноября 2010

System.IO.File.ReadAllBytes() будет считывать все байты в байтовом массиве, и после этого вы сможете читать из этой записи байтового массива по записи.

3 голосов
/ 26 ноября 2010

Вы можете использовать свойство Length из класса FileInfo для определения общего количества байтов, чтобы можно было также рассчитать количество байтов последней записи.
Таким образом, вы можете сохранить большую часть своей текущей логики.

1 голос
/ 26 ноября 2010

ваша проблема, которая мне кажется, как вы получите фактический размер записи последней записи.

Либо вы можете добавить эту информацию в заголовок в явном виде, тогда ваш код сработает, как мне кажется.

0 голосов
/ 26 ноября 2010

Я не парень .net, но, похоже, у вас есть пара вариантов. Должен быть способ определить размер файла. если вы можете найти это, вы можете прочитать все. альтернативно, в описании msdn для binaryreader.readbytes () сказано, что если вы запросите mroe, чем содержит поток, вы получите все, что находится в файле. Вы знаете максимальный размер блоба, который вы читаете? если это так, просто прочитайте это в предварительно очищенную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...