我正在使用Data.Binary来解码二进制文件,并发现runGet
函数会抛出异常“没有足够的字节”,即使它没有消耗掉所有输入。
具体来说,在循环中我反复尝试解析二进制文件,直到它消耗了所有输入
parsePCAP = do
gHeader <- parseGHeader
packets <- parsePPackets []
let packets' = catMaybes packets
return (Pcap gHeader packets')
where
parsePPackets xs = do
empty <- isEmpty
if empty
then return xs
else do p <- parseB6034
parsePPackets (p:xs)
当我尝试使用runGet
运行此函数时,将抛出异常“位置3293603处的Data.Binary.Get.runGet:没有足够的字节”,而输入的总长度为5864230,一个数字显着更大。函数parseB6034
每轮消耗不超过250个字节。此外,parsePPackets
在使用少量数据时效果很好。
这是我的代码问题还是包二进制文件的错误?根据{{1}}函数的要求,送入runGet
的ByteString是惰性ByteString。
以下是完整的代码
runGet
答案 0 :(得分:1)
我不确定这是否是解决问题的正确方法。如果没有,请指出正确的方法。
基本问题是我使用Word32
来表示包长度,其中一个pcap包短于47.从47减去的较短数字会导致算术溢出并导致{{1} } monad跳过Get
可以表示的最大字节数。