gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:36:42 27 4
gpt4 key购买 nike

我有一个具有以下结构的 C++ 应用程序已写入文件。现在我需要使用 python 解码它们,这里的基本问题是如何在 python 中反射(reflect) pragma pack 选项。

C++ 结构

#pragma pack(1)
struct abc
{
unsigned char r1;
unsigned char r2;
unsigned char p1;
unsigned int id;
};
#pragma pack()

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

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


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


以上资料来自python文档,不深究。

最佳答案

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

By default, Structure and Union fields are aligned in the same way the C compiler does it. It is possible to override this behavior be specifying a pack class attribute in the subclass definition. This must be set to a positive integer and specifies the maximum alignment for the fields. This is what #pragma pack(n) also does in 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14771150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com