为什么calcsize("!BHB")和calcsize("BHB")之间有差异?
在Python 2.4.3中,使用struct模块时,为什么calcsize("!BHB")和calcsize("BHB")会有不同的结果呢?
from struct import *
calcsize("!BHB") == 4
calcsize("BHB") == 5
我明白大端和小端的概念,但对于上面这两种格式的字节排列,我还是不太明白。
1 个回答
5
这个问题的原因在于 Python文档 中有解释,主要是因为在使用混合结构成员(BHB)时会出现填充问题。
填充只会在连续的结构成员之间自动添加。 在编码的结构开始或结束时不会添加填充。
当使用非本地大小和对齐方式时,不会添加填充, 比如使用‘<’,‘>’,‘=’,和‘!’。
看看这个:
>>> struct.pack("BHB",1,1,1)
'\x01\x00\x01\x00\x01'
>>> struct.pack("=BHB",1,1,1)
'\x01\x01\x00\x01'
在第一个例子中,由于使用了默认的本地大小和对齐方式,所以在Byte之间添加了填充。而当你明确使用‘=’设置为标准大小时,就不会添加填充了。