如何管理ctypes中的嵌套结构?
How to manage nested structures in ctypes?
我有一个具有以下联合的 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 时,字节数似乎不对应。
我已经尝试过这些解决方案
解决方案一:
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)]
方案二:
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 显示不正确。在我看来,由于嵌套结构,字节未对齐。
你能告诉我我做错了什么吗?非常感谢您!
我找到了!
即使在 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)]
希望这对其他人有帮助!
我有一个具有以下联合的 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 时,字节数似乎不对应。
我已经尝试过这些解决方案
解决方案一:
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)]
方案二:
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 显示不正确。在我看来,由于嵌套结构,字节未对齐。
你能告诉我我做错了什么吗?非常感谢您!
我找到了!
即使在 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)]
希望这对其他人有帮助!