我可以取回我的(byte)字符串吗?

时间:2014-07-30 16:47:05

标签: haskell marshalling

给定涉及VarInt s的二进制格式。这是具有大小不同的二进制表示的整数,是否可以运行并行解析器来校验我刚读过的所有内容?

示例:

一个简单的结构将被解析如下:

getFoo :: Get (VarInt, VarInt)
getFoo = (,) <$> getVarInt <*> getVarInt

修改: VarInt只是Int周围的新类型。它解析如下:

(参见http://tukaani.org/xz/xz-file-format.txt的第1.2节)

getVarInt :: Get VarInt
getVarInt = go 0
    where go i = do

        h <- fromIntegral <$> getWord8

        if not $ testBit h 7
          then return (h .&. 0x7F)
          else do
            t <- go (i+1)
            return $ h .|. (t `shiftL` (i * 7))

现在一些结构最后有CRC32校验和。如果预先知道结构的大小,我可以轻松lookAhead并运行校验和:

getFooCRC :: CRC32 -> Get (Int, Int)
getFooCRC expected = do
  crc <- crc32 <$> lookAhead (getBytes 8)
  when (crc /= expected) $ fail "checksum doesn't match"
  (,) <$> get <*> get

现在......如果我要解析包含VarInt s的相同结构,我将如何处理?

注意:我正在使用cereal库,但这同样适用于binary和类似的库。

0 个答案:

没有答案