Python固定长度数据包

2 投票
2 回答
1256 浏览
提问于 2025-04-15 14:49

我正在尝试用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 ]

撰写回答