今天在 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
>>>