python struct.pack('5sI', b'abc\x00', 1) 字节顺序,大小和对齐方式

今天在 python 里面手动构造 C 的 struct 时,惊奇的发现 struct.pack('5sI', b'abc\x00', 1) 返回结果的长度是 12 !

而 struct.pack('5s') + struct.pack('I', 1) 跟预想结果一致,是 9

看文档:
字节顺序,大小和对齐方式
Byte Order, Size, and Alignment

格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐方式:

字符 字节顺序 大小 对齐方式
@ 按原字节 按原字节 按原字节
= 按原字节 标准
< 小端 标准
> 大端 标准
! 网络(=大端) 标准

如果不填的话,默认就是 @,也就是说上面的 '5sI' 默认就是 '@5sI',也就是说按照 C 语言 struct 的尿性做对齐处理,相当于 C 的

struct 
{
  char s[5]; 
  int i;
}; 

按 4 字节对齐,最终大小就是 12

我的需求其实是设置 C 的 #pragma pack(1) ,并且保持原始字节序,所以我的格式字符串应该改成 '=5sI'

测试:

>>> struct.calcsize('5sI')
12
>>> struct.calcsize('@5sI')
12
>>> struct.calcsize('=5sI')
9
>>> 

+V d2h5X251bGw= 请备注:from博客园
原文地址:https://www.cnblogs.com/hangj/p/15742872.html