python ctypes 进行字节对齐读取的 pragma pack
我有一个用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而不是8
,这些数据被写入了一个数据文件。我该如何用Python来获取这些数据呢?
注意:
1. 我正在使用ctypes,以上结构体只是一个示例结构。
ctypes使用本机字节顺序来处理结构体和联合体。如果要构建具有非本机字节顺序的结构体,可以使用BigEndianStructure、LittleEndianStructure、BigEndianUnion和LittleEndianUnion这些基类。这些类不能包含指针字段。
以上信息来自Python文档,但没有深入讲解细节。
1 个回答
21
你可以按照这里的说明来改变ctypes中的数据对齐方式:这里
默认情况下,结构体和联合体的字段对齐方式和C语言编译器的处理方式是一样的。不过,你可以通过在子类定义中指定一个pack类属性来改变这种行为。这个属性必须设置为一个正整数,它表示字段的最大对齐方式。这和MSVC中的#pragma pack(n)功能是一样的。
对于你的例子,可以这样写:
from ctypes import *
class abc(Structure):
_pack_ = 1
_fields_ = [
('r1',c_ubyte),
('r2',c_ubyte),
('p1',c_ubyte),
('id',c_uint)]