为什么calcsize(“!BHB”)和calcsize(“BHB”)之间存在差异?

时间:2011-01-03 04:09:11

标签: python struct

在python 2.4.3中使用struct模块为什么calcsize(“!BHB”)和calcsize(“BHB”)之间存在差异? 由此; 当

from struct import *
calcsize("!BHB") == 4
calcsize("BHB") == 5

我理解big endian和little endian概念,但是对于上述格式的字节位置并没有真正得到它。

1 个答案:

答案 0 :(得分:5)

原因在Python Docs中解释,这是因为当您使用混合结构成员(BHB)时出现填充问题

  1. 填充仅在连续的结构成员之间自动添加。 在编码结构的开头或结尾没有添加填充。

  2. 使用非原生大小和对齐时,不添加填充, 例如使用'<','>','='和'!'。

  3. 见:

    >>> struct.pack("BHB",1,1,1)
    '\x01\x00\x01\x00\x01'
    >>> struct.pack("=BHB",1,1,1)
    '\x01\x01\x00\x01'
    

    在第一种情况下,填充被添加到Byte,因为它使用默认的原生大小和对齐,并使用'='显式设置标准大小,没有填充。