如何解析python中的二进制数字序列。 以下是我想要做的一个例子。解析一串二进制数字
我有二进制数字的序列,例如
sequence = '1110110100110111011011110101100101100'
和,我需要解析这个和提取数据。
说上述序列含有开始,ID,数据和结束字段
启动是一个2比特字段,ID是8位字段,数据字段可以从1至8192位变化,并且端为4位字段。
和解析后,我期待输出如下:
result = {start : 11,
id : 10110100,
data : 11011101101111010110010,
end : 1100,
}
我使用这个在我的应用程序之一。 我能够使用正则表达式解析序列,但问题是正则表达式必须由用户编写。所以作为替代方案,我使用BNF语法作为语法更具可读性。
我试着解决这个使用python的简约和 pyparsing解析器。但我无法找到可变长度字段的解决方案。
i的简约可写为Python语法如下:
grammar = """sequence = start id data end
start = ~"[01]{2}"
id = ~"[01]{8}"
data = ~"[01]{1,8192}"
end = ~"[01]{4}"
"""
由于数据字段的长度是可变的,并且分析器是贪心,上述序列是不能够匹配与上述语法。解析器将结束字段位带入数据字段。
我只是简化了我的问题,以上面的例子。
让我描述的全部问题。有3种数据包(让我们称它们为令牌,握手和数据包)。令牌和握手包的长度是固定的,数据包长度可变。 (以上示出的示例是用于数据分组的例子)
输入包括比特的连续流的。每个数据包的开始都由“开始”模式标记,数据包结束由“结束”模式标记。这两种都是固定位模式。
例令牌分组语法:
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种不同的数据包类型的切片工作方法要解析?
最好的解决方法是什么?
由于提前,
任何类型的解析器可能是这样的矫枉过正。你有*固定*宽度字段。 –
@Kolyoly我编辑了这个问题。可以有不同类型的数据包。所以我想到了使用语法来解决这个问题。 – user2109788