`runGet`过早退出

时间:2018-02-24 04:27:55

标签: haskell

我正在使用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

1 个答案:

答案 0 :(得分:1)

我不确定这是否是解决问题的正确方法。如果没有,请指出正确的方法。

基本问题是我使用Word32来表示包长度,其中一个pcap包短于47.从47减去的较短数字会导​​致算术溢出并导致{{1} } monad跳过Get可以表示的最大字节数。