python:struct pack()的意外行为

时间:2014-09-11 10:59:24

标签: python

我无法使用struct.pack()打包整数。

使用

struct.pack("BIB", 1, 0x1234, 0) 

我期待

'\x01\x00\x00\x034\x12\x00'

但我得到了

'\x01\x00\x00\x004\x12\x00\x00\x00'

我可能在这里遗漏了一些东西。请帮忙。

2 个答案:

答案 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'