为了账号安全,请及时绑定邮箱和手机立即绑定

ctypes c_uint32 从 python 错误地传递到 Cpp

ctypes c_uint32 从 python 错误地传递到 Cpp

斯蒂芬大帝 2023-06-20 10:22:45
我正在使用带有 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


查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信