用于字节对齐读取的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