我正在解析長度編碼的二進制流,我試圖讓這個代碼編譯。組合代碼(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