猿问

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

我正在使用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,如果这是一个非常幼稚的问题,抱歉。


潇潇雨雨
浏览 231回答 2
2回答

芜湖不芜

Python和C都允许您使用十六进制文字定义整数。它们被解释为以16为底,但是它们的值仍然是整数。对于相同的值,它不过是一种替代的表示法:>>> 0x022>>> 0x104260>>> import ctypes>>> ctypes.c_int(0x104)c_int(260)您还可以使用八进制(0o404,或者仅在python 2中使用0404)或二进制(0b100000100)表示法来指定相同的整数值。签名指定它需要一个int,因此传入一个整数值。如果需要,可以在Python源代码中将该整数值指定为十六进制文字,但是C代码只需要一个整数值,并且不管是否使用十六进制表示法创建该值。如果函数调用不能使用正确的常量,则其他问题是错误的。

慕容708150

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

相关分类

Python
我要回答