我有一个C ++应用程序,其下面的结构写入文件。现在我需要使用python解组它们,这里的基本问题是如何在python中反映pragma pack
选项。
C ++结构
#pragma pack(1)
struct abc
{
unsigned char r1;
unsigned char r2;
unsigned char p1;
unsigned int id;
};
#pragma pack()
现在,结构大小为7 not 8
,此数据被写入数据文件。如何使用python检索此数据。
注意:
1.我使用的是ctypes,上面的结构是一个样本结构。
ctypes使用结构和联合的本机字节顺序。要构建具有非本机字节顺序的结构,可以使用BigEndianStructure,LittleEndianStructure,BigEndianUnion和LittleEndianUnion基类之一。这些类不能包含指针字段
来自python docs的上述信息并没有详细介绍。
答案 0 :(得分:11)
您可以按照here
所述更改ctypes中的打包默认情况下,Structure和Union字段的对齐方式与C编译器的对齐方式相同。可以在子类定义中指定 pack 类属性来覆盖此行为。必须将其设置为正整数,并指定字段的最大对齐方式。这就是#pragma pack(n)在MSVC中的作用。
对于你的例子,这将是:
from ctypes import *
class abc(Structure):
_pack_ = 1
_fields_ = [
('r1',c_ubyte),
('r2',c_ubyte),
('p1',c_ubyte),
('id',c_uint)]