Чтение \ Запись структурированного двоичного файла - PullRequest
2 голосов
/ 04 ноября 2011

Я хочу прочитать \ записать двоичный файл, который имеет следующую структуру:

enter image description here

Файл составлен из «ЗАПИСЕЙ».Каждая «ЗАПИСЬ» имеет следующую структуру: я буду использовать первую запись в качестве примера

  • (красный) Байт 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.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

FileStream уже буферизован, так что я бы ожидал, что будет работать довольно хорошо. Вы всегда можете создать BufferedStream вокруг исходного потока, чтобы добавить дополнительную буферизацию, если вам это действительно нужно, но я сомневаюсь, что это будет иметь существенное значение.

Вы говорите, что "вообще не работает" - насколько быстро работает ? Насколько вы уверены, что IO - это то, куда уходит ваше время? Вы выполняли какое-либо профилирование кода?

1 голос
/ 09 декабря 2012

Я мог бы также предложить сначала прочитать 3 (или 6?) Байта вместо двух отдельных.Поместите начальные байты в небольшой массив, проверьте 5-байтовый байт, затем 2-байтовый индикатор длины, затем 3-байтовый код операции AFP, ТО, прочитайте оставшуюся часть записи AFP.

Этонебольшая разница, но это избавляет от одного из ваших звонков на чтение.

Я не Джон Скит, но довольно долго работал в одном из крупнейших печатных и почтовых магазинов в стране, и мыделал в основном вывод AFP: -)

(обычно в C, хотя)

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