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

kum*_*ran 6 python struct ctypes alignment

我有一个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()
Run Code Online (Sandbox Code Playgroud)

现在,结构大小是7 not 8,这个数据被写入一个数据文件.如何使用python检索此数据.

注意:
1.我使用的是ctypes,上面的结构是一个示例结构.


ctypes使用结构和联合的本机字节顺序.要构建具有非本机字节顺序的结构,可以使用BigEndianStructure,LittleEndianStructure,BigEndianUnion和LittleEndianUnion基类之一.这些类不能包含指针字段


来自python docs的上述信息并未深入研究细节.

Pet*_*vaz 12

您可以按照此处所述更改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)]
Run Code Online (Sandbox Code Playgroud)