使用本机字节顺序解释struct.pack中的额外填充

时间:2014-09-16 13:58:30

标签: python

当我使用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字节)。为什么本地字节顺序具有这些字节而小字节序或大字节字节顺序不具有?

1 个答案:

答案 0 :(得分:7)

这在struct module documentation

中有解释
  

注意:默认情况下,打包给定C结构的结果包括填充字节,以便为所涉及的C类型保持正确的对齐; 同样,在解包时会考虑对齐。选择此行为,以便打包结构的字节与相应C结构的内存中的布局完全对应。要处理与平台无关的数据格式或省略隐式填充字节,请使用标准大小和对齐而不是本机大小和对齐:有关详细信息,请参阅字节顺序,大小和对齐。

Byte Order, Size, Alignment

  

...

     

使用C编译器的sizeof表达式确定原生大小和对齐方式。这总是与本机字节顺序相结合。

     

...

     

注意:

     
      
  1. 填充仅在连续结构之间自动添加   成员。
  2.   
  3. 在开头或结尾都没有添加填充   编码结构。使用非原生大小时不添加填充   对齐,例如使用'&lt;','&gt;','='和'!'。
  4.   
  5. 对齐a的结尾   结构到特定类型的对齐要求,结束   格式与该类型的代码重复计数为零。看到   实施例。
  6.