我正在尝试在python中为ATSC PSIP生成器构建一个固定长度的数据包。这可能很简单,但到目前为止我似乎无法让它工作。我正在尝试构建一个包含类似于以下字段的数据包:
table_id = 0xCB
syntax = 0b1
reserved = 0b11
table_ext = 0xFF
最终目标将是二进制
中的以下内容'1100101111111111111'
我已经尝试了十几种不同的东西,无法得到我期望的结果。 我将通过套接字发送它,所以我认为它需要以字符串结束。
答案 0 :(得分:4)
您可以使用struct
module从任意布局构建二进制字符串。
这只能生成字节对齐的结构,但是你需要进行字节对齐才能在网络套接字上发送。
编辑:
因此,您生成的格式确实具有非对齐位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 ]
答案 1 :(得分:0)
Construct(http://construct.readthedocs.org/en/latest/)是二进制数据的解析器和构建器。它看起来非常适合这个应用程序,因为你可以从位和字节定义东西。它还具有有用的功能,如处理条件情况以及轻松检查终结器等。
我花了数年时间使用系统进行复杂的数据包创建和解析,而这些系统没有Construct所具有的一些功能,所以除非协议中有一些特别奇怪的东西,否则看起来Construct会处理它。 / p>