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

如何正确将十六进制值传递给Python ctypes中的C dll?

如何正确将十六进制值传递给Python ctypes中的C dll?

潇潇雨雨 2021-03-09 13:10:05
我正在使用ctypes从python调用C DLL。对于大多数功能,所有功能都可以正常工作。但是...现在我有一个需要输入十六进制常量的函数,而且我似乎无法正确传递它。我没有C源代码,但是从文档中可以看到,函数定义如下:sensv_bn* NewSensvToFinding_bn (const node_bn* Qnode, const nodelist_bn* Vnodes, int what_find)我几乎可以肯定我正在传递Qnode并且Vnodes正确,因为它们是由DLL中的其他函数创建的。问题是与int所谓的what_find。从DLL附带的头文件中,我看到以下行: enum {ENTROPY_SENSV = 0x02, REAL_SENSV = 0x04, VARIANCE_SENSV = 0x100, VARIANCE_OF_REAL_SENSV = 0x104};   /* for NewSensvToFinding_bn */我要传递what_find的值VARIANCE_OF_REAL_SENSV是十六进制值0x104。我试着不经过转换就传递了它,也使用ctypes.c_int(0x104)了它,将其强制转换为int,但是函数返回的是0而不是指针。我也尝试过不经过转换而得到相同的结果。我应该执行更适当的转换吗?我有点C n00b,如果这是一个非常幼稚的问题,抱歉。
查看完整描述

2 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

Python和C都允许您使用十六进制文字定义整数。它们被解释为以16为底,但是它们的值仍然是整数。对于相同的值,它不过是一种替代的表示法:


>>> 0x02

2

>>> 0x104

260

>>> import ctypes

>>> ctypes.c_int(0x104)

c_int(260)

您还可以使用八进制(0o404,或者仅在python 2中使用0404)或二进制(0b100000100)表示法来指定相同的整数值。


签名指定它需要一个int,因此传入一个整数值。如果需要,可以在Python源代码中将该整数值指定为十六进制文字,但是C代码只需要一个整数值,并且不管是否使用十六进制表示法创建该值。


如果函数调用不能使用正确的常量,则其他问题是错误的。


查看完整回答
反对 回复 2021-03-26
?
慕容708150

TA贡献1831条经验 获得超4个赞

万一有兴趣的人,问题是我得到的返回0表示函数运行正常。我需要的是函数实际返回的浮点数,该浮点数是通过使用restype方法并将其设置为ctypes.c_double获得的。输入的十六进制问题导致出现红色鲱鱼,但是对于学习Python和C如何处理十六进制值非常有用。

查看完整回答
反对 回复 2021-03-26
  • 2 回答
  • 0 关注
  • 229 浏览
慕课专栏
更多

添加回答

举报

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