目前通过c++程序生成的文件,需要python读取出数据。但发现直接按字段类型读取,会提示指定buf长度与格式串不匹配,需要xx字节。
- 其中一个结构体的格式串为:'c31sidqciqqqiii'。这个结构体可以正常读出。
>>> struct.calcsize('c31sidqcciiiii') 80
- 第二个结构体格式串为'c31sidqciqqqiii'。这个结构体计算需要100字节,实际c++程序中显示sizeof()是104字节。根据python文档描述,说是不会在尾部添加padding.“Padding is only automatically added between successive structure members. No padding is added at the beginning or the end of the encoded struct.”, 根据结构,可以在尾部加一个'0q'来强制指定8字节对齐。
-
>>> struct.calcsize('c31sidqciqqqiii') 100 >>> struct.calcsize('c31sidqciqqqiii0q') 104
- 第二个结构体格式串为''31sciddqqdqdqdddddqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqiiidddc'',计算尺寸为497,但实际c++中sizeof()是504字节,因此判断这个结构体是8字节对齐,因此考虑加入'7x'或'0q'来补足长度。
>>> struct.calcsize('31sciddqqdqdqdddddqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqiiidddc') 497 >>> struct.calcsize('31sciddqqdqdqdddddqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqiiidddc7x') 504 >>> struct.calcsize('31sciddqqdqdqdddddqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqdqiiidddc0q') 504