Я пытаюсь проанализировать заголовок файла 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нет позиции.Конечно, он не обеспечивает эту функциональность.
Есть идеи?