为什么Python struct.pack中的混合类型使用的空间比需要的多?

sco*_*ozy 6 python pack

我刚刚尝试在Python中使用struct.pack,当我混合类型时,我不理解它的行为

当我试图打包一个char而没有别的东西时,它按预期工作,即

struct.pack("b",1)
Run Code Online (Sandbox Code Playgroud)

'\x01'.但是一旦我尝试混合不同类型的数据,char就被填充为与此类型一样长,例如

struct.pack("bi",1,1)
Run Code Online (Sandbox Code Playgroud)

'\x01\x00\x00\x00\x01\x00\x00\x00'.

这是标准行为,为什么?有办法解决吗?

编辑

更简单地说:

>>> struct.calcsize("b")
1
>>> struct.calcsize("i")
4
>>> struct.calcsize("bi")
8
Run Code Online (Sandbox Code Playgroud)

Aar*_*lla 8

struct.pack通常用于访问内存结构,而不是文件.在内存中,访问在奇数/未对齐地址占用多个字节的数据可能导致异常或性能损失.

这就是为什么编译器对齐数据(通常在4或8字节边界上),struct Python中的模块也是如此.

要禁用此功能,可以使用格式字符串的第一个字符来设置字节顺序和对齐方式.在你的情况下,试试吧struct.pack("=bi",1,1)

如果您没有指定任何内容,那么隐式@表示"本机字节顺序,大小和对齐".有关其他选项,请参阅文档.