给定涉及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的相同结构,我将如何处理?