Haskell:解析二进制流然后计算其CRC

时间:2011-04-03 16:16:16

标签: haskell binary

我正在尝试使用Haskell的Data.Binary.Get解析Gzip文件的标头。标题结构如下:

  • 包含ID,旗帜,其他
  • 的固定字段
  • 如果标志& 0x01,然后是可选的16位字(长度)+长度字节数据
  • 如果标志& 0x02,然后null终止字符串
  • if flag& 0x04,然后null终止字符串
  • ...
  • 上述CRC32

要报告错误(例如Gzip意外字段),我将以下内容用于解析器:

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

这是我的问题:我如何解析所有固定的&标题中的变量字段,但同时获取字段被解析的ByteString,以便我可以计算并验证CRC?

我注意到我需要返回错误,因为我考虑过使用lookAhead,但它的类型为Get a -> Get a,这意味着我无法在内部进行错误处理,这是我需要的做。

这几乎就像我需要为Get monad设置书签,读取字段,然后从书签到当前位置询问Get for ByteString。当然它不提供这种功能。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

使用runGetState,它返回消耗的字节数。然后你可以从原来的ByteString和校验和中删除那么多字节。