我无法使用struct.pack()
打包整数。
使用
struct.pack("BIB", 1, 0x1234, 0)
我期待
'\x01\x00\x00\x034\x12\x00'
但我得到了
'\x01\x00\x00\x004\x12\x00\x00\x00'
我可能在这里遗漏了一些东西。请帮忙。
答案 0 :(得分:8)
'\x01\x00\x00\x004\x12\x00\x00\x00'
^ this '4' is not part of a hex escape
实际上与:
相同'\x01\x00\x00\x00\x34\x12\x00\x00\x00'
因为“4”的ASCII码是0x34。
因为您使用了默认(本机)格式,所以Python使用原生对齐方式来处理数据,因此第二个字段已对齐以抵消4和3之前的零。
要获得更符合您需要的结果,请使用格式>BIB
或<BIB
(分别用于big-endian或little-endian)这会为您提供'\x01\x00\x00\x12\x34\x00'
或{{1 }}。这些都不是你指定的,因为你给出的例子不是0x1234的正确的大端或小端表示。
另见:文档中的Byte Order, Size, and Alignment部分。
答案 1 :(得分:2)
来自docs
注意默认情况下,打包给定C结构的结果包括填充字节,以便保持C类型的正确对齐 参与;类似地,在拆包时考虑对齐。 选择此行为以便打包结构的字节 完全对应于相应C的内存布局 结构。处理与平台无关的数据格式或省略隐式 填充字节,使用标准大小和对齐而不是本机大小和 alignment:有关详细信息,请参阅字节顺序,大小和对齐。
您可以通过强制执行字节顺序来获得所需的结果。 (chr(0x34)
== '4'
)
>>> struct.pack(">BIB", 1, 0x1234, 0)
'\x01\x00\x00\x124\x00'