我正在解析长度编码的二进制流,我试图让这个代码编译。组合代码(https://github.com/jlouis/combinatorrent/blob/master/src/Protocol/Wire.hs)对于让我继续前进非常有帮助,但现在我陷入困境。如何在return语句中使用frame_length?有条件的解析和铸造Attoparsec
data FrameCont = FINAL | MORE | BADCONT
deriving (Show, Eq)
frame_cont 0x00 = FINAL
frame_cont 0x01 = MORE
frame_cont otherwise = BADCONT
data FrameSize = Small Word8 | Jumbo B.ByteString
deriving (Show)
get_fc = do
raw_cont <- AP.anyWord8
guard((frame_cont raw_cont) /= BADCONT) AP.<?> "State must be either MORE or FINAL"
return raw_cont
parser = do
frame_length <- AP.anyWord8
case frame_length of
0x255 -> return (Jumbo <$> AP.take 8, get_fc, AP.take (fromIntegral frame_length))
otherwise -> return (Small otherwise, get_fc, AP.take (fromIntegral frame_length))
另外:我如何使用通过(AP.take 8)到Word64中?
没有更多的上下文,我们只能猜测。 “解析器”应具有哪种类型?它应该做什么?如果我正确理解了最后一个问题:可以通过'foldl'(\ wb - >(shiftL w 8)。|将一个8字节ByteString(从AP.take 8获得)转换为Word64。来自整体b)0。 unpack'。 –
我已经提前并添加了更多上下文。我有一个封装了Word8和ByteString的类型。我将来想要将字符串更改为Word64。 – xrl