9

我有一个具有以下结构的 C++ 应用程序写入文件。现在我需要使用 python 解组它们,这里的基本问题是如何pragma pack在 python 中反映选项。

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 文档的信息,并未深入探讨。

4

1 回答 1

19

您可以按照此处所述更改 ctypes 中的包装

默认情况下,结构和联合字段的对齐方式与 C 编译器的对齐方式相同。可以通过在子类定义中指定类属性来覆盖此行为。这必须设置为正整数并指定字段的最大对齐方式。这也是 #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)]
于 2013-02-08T13:11:23.933 回答