Python中使用ctypes的回调中的c\u void\u p参数

2024-04-23 15:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常使用ctypes,但是我遇到了一些我无法解释的事情。在

首先,当我用c_void_p定义回调时,回调将接收一个平面整数。在

我还看到其他一些帖子提到在使用c\uvoid\u p作为返回值时将c_void_p包装到另一个指针中。所以,我想我可以尝试一下回调定义中的参数:POINTER(c_void_p)。现在,当回调被调用时,我会得到一个指针,但我仍然不知道它是否指向值数据。在

因为C_void_p指向一个包含二进制数据的缓冲区,所以我不相信我可以使用C_char_p,我将转换成一个长度为我要传递的无符号字符数组,但是Python告诉我我我有一个元组,并且没有“contents”或“value”属性可以使用。在

建议?在


Tags: 数据参数定义整数ctypes事情帖子平面
1条回答
网友
1楼 · 发布于 2024-04-23 15:29:59

在回调中接收c_void_p作为整数是正常的。它使用简单类型的getfunc进行自动转换,这与将c_void_p作为Structure字段相同。ctypes不会自动转换简单类型的子类,例如type('my_void_p', (c_void_p,), {})。不过我觉得这不重要。在

假设您在p中有一个整数地址。可以使用以下任一方法将其转换为长度为c_charn数组:

buf = cast(p, POINTER(c_char * n))[0]

# 2.6+
buf = (c_char * n).from_address(p)

也就是说,知道它是一个char *,我将定义回调以使用POINTER(c_char)。然后通过索引或片访问缓冲区,例如p[0]或{}。在


*p[n]等价于*(p + n),其中*是解引用运算符,加法使用基于引用对象大小的指针算法。您可以使用p.contents而不是p[0],但后者也会调用类型的getfunc转换器(如果适用)。

相关问题 更多 >