gpt4 book ai didi

haskell - Haskell中二进制数据的一元解析

转载 作者:行者123 更新时间:2023-12-04 19:01:46 29 4
gpt4 key购买 nike

我对 Haskell 很陌生,我的第一个项目是解析捕获的 WLAN 数据包。解析此类数据包的常见模式是 header 字段将定义剩余字节的结构。作为一个通用示例,数据包可以像这样格式化:

header + [payload A | payload B | ..] 

其中 header 中的标志字段(可以是位图)指定数据包中包含哪些有效负载。有关此格式的具体示例,请查看 radiotap .

A similar thread建议只使用 parse 的序列像这样的操作:
parseAll = do
hdr <- parseHeader
pa <- parsePayloadA
pb <- parsePayloadB

但是,由于有效载荷 A 的存在,它似乎不适用于我的情况。和 B由 header 定义。换言之,数据解析的控制流需要遵循先验的解析结果。我想了解,如果有一种通用的方法可以用这种模式解析二进制数据?

最佳答案

请注意 parseAll使用某种 单子(monad)解析器库(从 do 符号和绑定(bind)的使用可以看出)。 monad 的力量正是您选择 parsePayloadAparsePayloadB可以依赖 hdr : 你拥有 Haskell 的全部权力来检查 hdr .

所以基本上你可以做类似的事情

parseAll = do
hdr <- parseHeader
payload <- case somethingInTheHdr hdr of
ThisIsAnA -> do
a <- parsePayloadA
return (PayloadA a)
ThisIsAB -> do
b <- parsePayloadB
return (PayloadB b)
-- can use body here, e.g.
return (Packet hdr payload)

您之所以拥有这种能力,是因为在单子(monad)绑定(bind)的类型中:
(>>=) :: m a -> (a -> m b) -> m b
a -> m b 中的箭头是真正的 Haskell 函数箭头,为您提供所需的所有功能。

关于haskell - Haskell中二进制数据的一元解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36122731/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com