Python固定长度数据包
我正在尝试用Python构建一个固定长度的数据包,用于ATSC PSIP生成器。这可能很简单,但到目前为止我还没能成功。我想构建一个包含以下字段的数据包:
table_id = 0xCB
syntax = 0b1
reserved = 0b11
table_ext = 0xFF
最终目标是得到以下的二进制数据:
'1100101111111111111'
我试过很多不同的方法,但结果都不是我预期的。我打算通过套接字发送这个数据包,所以我认为它需要以字符串的形式结束。
2 个回答
0
Construct(http://construct.readthedocs.org/en/latest/)是一个用于解析和构建二进制数据的工具。它看起来非常适合这个应用,因为你可以从比特和字节开始定义内容。它还具备一些很实用的功能,比如处理条件情况,以及轻松检查结束符等。
我花了很多年在一个复杂的数据包创建和解析系统上工作,但那个系统没有Construct的一些功能。所以,除非协议中有特别奇怪的地方,否则Construct应该能很好地处理这些情况。
4
你可以使用struct
模块来根据任意布局构建二进制字符串。
这个模块只能生成字节对齐的结构,但无论如何,你在网络传输时也需要字节对齐。
编辑:
所以你生成的格式确实有一些不对齐的位,比如8-1-1-2-12-16等等。
为了在套接字上发送数据,你需要确保字节对齐,但我想这个协议可能会以某种方式处理这个问题。(也许在某个地方加了填充位?)
我新的建议是先构建一个位字符串,然后把它切分成8位的块,再进行转换:
input_binary_string = "110010111111111111101010" ## must be a multiple of 8
out = []
while len(input_binary_string) >= 8:
byte = input_binary_string[:8]
input_binary_string = input_binary_string[8:]
b = int(byte,2)
c = chr(b)
out.append(c)
## Better not have a bits left over
assert len(input_binary_string) == 0
outString = "".join(out)
print [ ord(c) for c in out ]