Haskell: анализирует двоичный поток и затем вычисляет его CRC - PullRequest
0 голосов
/ 03 апреля 2011

Я пытаюсь проанализировать заголовок файла Gzip , используя Haskell Data.Binary.Get.Заголовок имеет следующую структуру:

  • Фиксированные поля, содержащие идентификатор, флаг, другие
  • Если флаг & 0x01, то необязательное 16-битное слово (длина) + длина байтов данных
  • Если флаг & 0x02, то строка с нулевым символом в конце
  • , если флаг & 0x04, то строка с нулевым символом в конце
  • ...
  • CRC32 выше

Чтобы сообщить об ошибках (например, неожиданные поля Gzip), я использую следующее для синтаксического анализатора:

Data GzipError = GE1 | GE2 | ...
instance Error GzipError where ...
parseHeader :: ErrorT GzipError Get GzipHeader

Вот моя проблема: Как мне проанализировать все поля фиксированных и переменных взаголовок, но в то же время получить ByteString, с которой анализируются поля, чтобы я мог вычислить и проверить CRC?

Я отмечаю необходимость возвращать ошибки, потому что я думал об использовании lookAhead, но имеет тип Get a -> Get a, что означает, что я не могу выполнить обработку ошибок внутри, что мне нужно делать.

Это почти как если бы мне нужно было установить закладку для монады Get,прочитайте поля, а затем спросите Get для ByteString от закладки до curreнет позиции.Конечно, он не обеспечивает эту функциональность.

Есть идеи?

1 Ответ

2 голосов
/ 03 апреля 2011

Используйте runGetState, он возвращает количество использованных байтов. Затем вы можете просто отрубить столько байтов из оригинальной строки ByteString и проверить их.

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