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

Posted

技术标签:

【中文标题】用于字节对齐读取的python ctypes pragma pack【英文标题】:python ctypes pragma pack for byte aligned read 【发布时间】:2013-01-24 03:14:33 【问题描述】:

我有一个具有以下结构的 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】:

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

默认情况下,结构和联合字段的对齐方式与 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)]

【讨论】:

以上是关于用于字节对齐读取的python ctypes pragma pack的主要内容,如果未能解决你的问题,请参考以下文章

Python 可写缓冲区/内存视图到数组/字节数组/ctypes 字符串缓冲区

Python Ctypes OSError:异常:访问冲突读取0x00000000

Python的结构和处理器的对齐[重复]

内存对齐

『Python CoolBook』ctype读取Linux动态库so文件

用于读取可变参数长度的 Python C 包装器