我正在使用带有 ctypes 的 python 来调用 C so 文件。
C结构为:
typedef struct {
uint32_t var1;
uint32_t var2;
uint32_t var3;
uint8_t var4;
uint8_t var5
} struct1;
If I call C code where I set the variables of var1 to 0x050A, var2 to 0x102 and var3 to 0x203 build it and print out the values everything works perfectly.
in C
static struct1 mstruct;
mstruct.var1=1290
mstruct.var2=258
mstruct.var3=515
然后我调用 ac so file 打印出传递给它的结构的值。
printf("var1 %lx\n",mstruct.var1) # var1 050A
printf("var2 %lx\n",mstruct.var2) # var2 102
printf("var3 %lx\n",mstruct.var3) # var3 203
请注意,如果我只使用 x 而不是 lx,它不会构建并给出错误。
但是当从 C 调用时,一切都正确打印出来
var1 050A
var2 102
var3 203
现在,如果我用 python 初始化并调用相同的结构,我将一个类定义为:
class struct1(ctypes.Structure):
_fields_=[
('var1',ctypes.c_uint32),
('var2',ctypes.c_uint32),
('var3',ctypes.c_uint32),
('var4',ctypes.c_uint8),
('var5',ctypes.c_uint8)]
def __init__(self):
self.var1=1290
self.var2=258
self.var3=515
if __name__=='__main__':
mstruct=struct1()
print('var1 {} type {}'.format(mstruct.var1,type(mstruct.var1)))
clib=ctypes.CDLL('csofile.so')
c_rtn=clib.print_c_struct(ctypes.byref(mstruct))
Var1 值是正确的,类型打印为类“int”(不是 ctypes uint32)。
在 C so 文件中打印出
var1 1020000050a
var2 50a00000203
var3 20300000102
Var1 的最低 16 位是正确的值。中间 16 位用正确的零填充。但是有一个高 32 位来自 var 2 应该在 var1 中的内容。Var2 从 Var3 的值开始。
似乎有一个不匹配,就像我的 python 并没有真正将它定义为 32 位,但更奇怪的是 C 实际上将它读取为 64 位,我不明白怎么会这样。由于 C 结构将它定义为 32 位,我希望它只占用 32 位,所以不知何故它被 python 看到了 64 位。
如果我将所有内容都更改为 int 它在我的演示应用程序中可以完美运行,但真正的 C so 文件是由其他人创建的,我每隔几天就会得到一个新文件,所以我尽量避免每次都更改它。
当我在init中设置值时,我也尝试过强制转换,我想也许我正在覆盖类型,但这似乎没有改变任何东西。
self.var1=(ctypes_c_uint32)(1290)
任何帮助将不胜感激。
斯蒂芬大帝
红颜莎娜
随时随地看视频慕课网APP
相关分类