Я хочу прочитать \ записать двоичный файл, который имеет следующую структуру:
Файл составлен из «ЗАПИСЕЙ».Каждая «ЗАПИСЬ» имеет следующую структуру: я буду использовать первую запись в качестве примера
- (красный) Байт START: 0x5A (всегда 1 байт, фиксированное значение 0x5A)
- (зеленый) ДЛИНА БАЙТОВ: 0x00 0x16 (всегда 2 байта, значение может изменяться от «0x00 0x02» до «0xFF 0xFF»)
- (синий) СОДЕРЖАНИЕ: Количество байтов, указанное десятичным значением поля LENGTH минус 2.В этом случае значение поля LENGHT равно 22 (0x00 0x16 преобразуется в десятичное число), поэтому CONTENT будет содержать 20 (22 - 2) байтов.
Моя цель - прочитать каждую запись одну за другой и записать ее в выходной файл.На самом деле у меня есть функция чтения и записи (некоторый псевдокод):
private void Read(BinaryReader binaryReader, BinaryWriter binaryWriter)
{
byte START = 0x5A;
int decimalLenght = 0;
byte[] content = null;
byte[] length = new byte[2];
while (binaryReader.PeekChar() != -1)
{
//Check the first byte which should be equals to 0x5A
if (binaryReader.ReadByte() != START)
{
throw new Exception("0x5A Expected");
}
//Extract the length field value
length = binaryReader.ReadBytes(2);
//Convert the length field to decimal
int decimalLenght = GetLength(length);
//Extract the content field value
content = binaryReader.ReadBytes(decimalLenght - 2);
//DO WORK
//modifying the content
//Writing the record
Write(binaryWriter, content, length, START);
}
}
private void Write(BinaryWriter binaryWriter, byte[] content, byte[] length, byte START)
{
binaryWriter.Write(START);
binaryWriter.Write(length);
binaryWriter.Write(content);
}
Этот способ действительно работает.Однако, так как я имею дело с очень большими файлами, я считаю, что он вообще не работает, потому что я читаю и пишу 3 раза для каждой записи.На самом деле я хотел бы прочитать куски ошибок вместо небольшого объема байта и, возможно, работать в памяти, но мой опыт использования Stream останавливается на BinaryReader и BinaryWriter.Заранее спасибо.