函数返回指向具有结果的数组的指针。如何访问此数据

2024-07-08 11:25:26 发布

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

我有一个从dll导入并在ctypes中定义的函数。我将restype设置为c_void_p。所以现在当我调用这个函数时,结果它返回指向32字节数组的指针。如何将此指针转换为Python字节类型?在

以下是函数(它是来自OpenSSL的HMAC):

self.HMAC = self._lib.HMAC
self.HMAC.restype = ctypes.c_void_p
self.HMAC.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p, ctypes.c_void_p]

编辑:我尝试过用c_char_p替换c_void_p。我得到了一些结果,但是c_char_p表示以空结尾的字符串,因此结果在第一个00h的点处被截断。如果HMAC在结果中没有任何零,那么它就完美地工作了。但这仍然不能解决我的问题。在


Tags: 函数self类型字节定义数组ctypeshmac
1条回答
网友
1楼 · 发布于 2024-07-08 11:25:26

使用ctypes.c_void_p作为返回类型通常是错误的。在

对于非nul结尾的字符串,应该将其设置为大小合适的字符数组;在您的例子中是32,所以ctypes.c_char * 32restype是指向此的指针,因此将其包装在ctypes.POINTER中。在

您可以使用该指针的value(或raw;在这个上下文中是相同的)属性,以bytes对象的形式访问返回值。在

下面是一个使用^{}的实际示例,它返回一个13个字符的字符串:

>>> import ctypes
>>> crypt = ctypes.CDLL('libcrypt.so').crypt
>>> crypt.argtypes = ctypes.c_char_p, ctypes.c_char_p
>>> crypt.restype = ctypes.POINTER(ctypes.c_char * 13)
>>> crypt('tea', 'ea')
<__main__.LP_c_char_Array_13 object at 0x7f7d464f2200>
>>> crypt('tea', 'ea').contents
<__main__.c_char_Array_13 object at 0x7f7d464f2290>
>>> crypt('tea', 'ea').contents.value
b'eauWokonZwxw2'

相关问题 更多 >

    热门问题