python ctypes pragma pack用于字节对齐读取

时间:2013-02-08 11:04:47

标签: python struct alignment ctypes

我有一个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的上述信息并没有详细介绍。

1 个答案:

答案 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)]