蟒蛇ctypes的编译包的字节对齐读(python ctypes pragma pack for b

2019-07-19 15:28发布

我有以下结构写入文件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使用结构和联合原始的byte顺序。 要建立与非本地字节顺序结构,你可以使用BigEndianStructure,LittleEndianStructure,BigEndianUnion和LittleEndianUnion中的一个基类。 这些类不能包含指针字段


从Python文档的上述信息,并没有深入细节。

Answer 1:

描述你可以在ctypes的更换包装这里

默认情况下,结构和联合字段以同样的方式在c编译器的对齐。 它可以覆盖这个行为在子类中定义一个类属性。 这必须被设置为一个正整数,用于指定字段的最大对齐。 这是包的#pragma什么(N)在MSVC。

为了您的例子,这会是:

from ctypes import *

class abc(Structure):
    _pack_ = 1
    _fields_ = [
        ('r1',c_ubyte),
        ('r2',c_ubyte),
        ('p1',c_ubyte),
        ('id',c_uint)]


文章来源: python ctypes pragma pack for byte aligned read