我正在使用带有 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 Cstatic 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 050Avar2 102var3 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=515if __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 1020000050avar2 50a00000203var3 20300000102Var1 的最低 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)任何帮助将不胜感激。
1 回答
红颜莎娜
TA贡献1842条经验 获得超12个赞
long
在您的系统上是 64 位的,如printf("%lx")
打印 64 位整数所示。正如我在评论中看到的那样,您的 C 代码uint32_t
被定义为unsigned long
在该系统上不正确。
您的系统应该有一个为您的操作系统正确stdint.h
定义的标头。uint32_t
添加回答
举报
0/150
提交
取消