У меня есть двоичный файл, который я читаю в коллекцию байтовых массивов.
Файл содержит несколько (произвольное количество) записей. По сути блок байтов. Каждая запись имеет произвольную длину.
В заголовке файла указаны смещения каждой записи.
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);
}