有人可以解释为什么我在struct.pack中使用本机字节顺序时得到额外的字节?
>>> import struct
>>> struct.pack('cI', 'a', 1)
'a\x00\x00\x00\x01\x00\x00\x00'
>>> struct.pack('<cI', 'a', 1)
'a\x01\x00\x00\x00'
因此,本机字节顺序的前面是'a',然后是3-(00个字节)。为什么本地字节顺序具有这些字节,而小端字节顺序或大端字节顺序却没有?
这在struct
模块文档中进行了解释:
注意:默认情况下,打包给定C结构的结果包括填充字节,以维护所涉及C类型的正确对齐;同样,拆箱时也要考虑对齐方式。选择此行为是为了使打包结构的字节与对应的C结构的内存中的布局完全对应。要处理与平台无关的数据格式或忽略隐式填充字节,请使用标准大小和对齐方式,而不是本机大小和对齐方式:有关详细信息,请参见字节顺序,大小和对齐方式。
....
原始大小和对齐方式是使用C编译器的sizeof表达式确定的。这始终与本机字节顺序结合在一起。
...
笔记:
- 仅在连续的结构成员之间自动添加填充。
- 在编码结构的开头或结尾不添加填充。使用非本机大小和对齐方式(例如,使用'<','>','='和'!')时,不添加填充。
- 要将结构的末尾与特定类型的对齐要求对齐,请使用该重复类型为零的该类型的代码结束格式。请参阅示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句