如何管理ctypes中的嵌套结构?

2024-09-30 05:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个C++库,具有以下的结合:

typedef union DVersion
{
    uint32_t VMask;
    struct
    {
        uint8_t Build;
        uint8_t Rev;
        uint8_t Min;
        uint8_t Maj;
    };
}DATA_VER;

还有另一个结构,其中包含一个字段

typedef struct DH
{
    uint16_t   Tok1;
    DATA_VER   DVersion;
    uint16_t   DataCount;
}DataHeader

当我在C++上使用这个DLL时,它也很好用,也在C++上。因此,DLL被验证

当我使用ctypes处理Python时,看起来字节数不一致

我尝试过这些解决方案

解决方案1:

class VER_Struct(Structure):
    _fields_ = [("Build", c_uint8),
                ("Rev",  c_uint8),
                ("Min",  c_uint8),
                ("Maj",  c_uint8)]

class DATA_VER(Union):
    _anonymous_ = ("u",)
    _fields_ = [("VMask", c_uint32, 32), 
                ("u",VER_Struct)]

class DataHeader(Structure):
    _fields_ = [("Tok1", c_uint16, 16),
                ("DVersion", DATA_VER),
                ("DataCount", c_uint16, 16)]

解决方案2:

class DATA_VER(Union):
    _fields_ = [("VMask", c_uint32, 32), 
                ("Build", c_uint8),
                ("Rev",  c_uint8),
                ("Min",  c_uint8),
                ("Maj",  c_uint8)]

class DataHeader(Structure):
    _fields_ = [("Tok1", c_uint16, 16),
                ("DVersion", DATA_VER),
                ("DataCount", c_uint16, 16)]

在这两种情况下,Tok1的值都正确,但DVersion和DataCount显示不正确。在我看来,由于嵌套结构,字节未对齐

你能告诉我我做错了什么吗?非常感谢您的支持


Tags: buildfieldsdatarevminclassmajuint32
1条回答
网友
1楼 · 发布于 2024-09-30 05:17:44

我发现了

即使ctypes文档中没有明确说明,也应该包括 _pack_ = 1在您的结构上。就我而言:

class VER_Struct(Structure):
    _fields_ = [("Build", c_uint8),
                ("Rev",  c_uint8),
                ("Min",  c_uint8),
                ("Maj",  c_uint8)]

class DATA_VER(Union):
    _anonymous_ = ("u",)
    _fields_ = [("VMask", c_uint32, 32), 
                ("u",VER_Struct)]

class DataHeader(Structure):
    _pack_   = 1
    _fields_ = [("Tok1", c_uint16, 16),
                ("DVersion", DATA_VER),
                ("DataCount", c_uint16, 16)]

希望这对其他人有帮助

相关问题 更多 >

    热门问题