python ctypes 进行字节对齐读取的 pragma pack

9 投票
1 回答
13467 浏览
提问于 2025-04-17 15:14

我有一个用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)]

撰写回答