如何在 python 中解析二进制数字序列。以下是我正在尝试做的一个例子。
我有一个二进制数字序列,例如
sequence = '1110110100110111011011110101100101100'
而且,我需要解析它并提取数据。
假设上面的序列包含start、id、data 和 end 字段
start 是 2 位字段,id 是 8 位字段,数据字段可以在 1 到 8192 位之间变化,end 是 4 位字段。
解析后我期望输出如下:
result = {start : 11,
id : 10110100,
data : 11011101101111010110010,
end : 1100,
}
我在我的一个应用程序中使用它。我可以使用正则表达式解析序列,但问题是正则表达式必须由用户编写。因此,作为替代方案,我使用 BNF 语法,因为语法更具可读性。
我尝试使用 python 的简约和pyparsing解析器来解决这个问题。但我无法找到可变长度字段的解决方案。
我写的可用于python的语法parsimonious
如下:
grammar = """sequence = start id data end
start = ~"[01]{2}"
id = ~"[01]{8}"
data = ~"[01]{1,8192}"
end = ~"[01]{4}"
"""
由于数据字段是可变长度的,并且解析器是贪婪的,所以上述序列无法与上述语法匹配。解析器将结束字段位带入数据字段。
我只是将我的问题简化为上面的示例。
让我描述一下完整的问题。有 3 种数据包(我们称它们为 Token、Handshake 和 Data 数据包)。令牌和握手包是固定长度的,数据包是可变长度的。(上面的例子是数据包的例子)
输入由连续的比特流组成。每个数据包开始由“开始”模式标记,数据包结束由“结束”模式标记。这两者都是固定的位模式。
令牌包语法示例:
start - 2 bits, id - 8 bits, address - 7bits, end - 4bits
111011010011011101100
握手包语法示例:
start - 2 bits, id - 8bits, end - 4 bits
11101101001100
顶级规则示例:
packet = tokenpacket | datapacket | handshakepacket
如果只有一种类型的数据包,那么切片将起作用。但是当我们开始解析时,我们不知道最终会匹配到哪个数据包。这就是为什么我想到使用语法的原因,因为这个问题与语言解析非常相似。
我们可以让切片方法在我们有 3 种不同的数据包类型要解析的情况下工作吗?
解决这个问题的最佳方法是什么?
提前致谢,