为什么calcsize("!BHB")和calcsize("BHB")之间有差异?

0 投票
1 回答
589 浏览
提问于 2025-04-16 09:19

在Python 2.4.3中,使用struct模块时,为什么calcsize("!BHB")和calcsize("BHB")会有不同的结果呢?

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

我明白大端和小端的概念,但对于上面这两种格式的字节排列,我还是不太明白。

1 个回答

5

这个问题的原因在于 Python文档 中有解释,主要是因为在使用混合结构成员(BHB)时会出现填充问题。

  1. 填充只会在连续的结构成员之间自动添加。 在编码的结构开始或结束时不会添加填充。

  2. 当使用非本地大小和对齐方式时,不会添加填充, 比如使用‘<’,‘>’,‘=’,和‘!’。

看看这个:

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

在第一个例子中,由于使用了默认的本地大小和对齐方式,所以在Byte之间添加了填充。而当你明确使用‘=’设置为标准大小时,就不会添加填充了。

撰写回答