2

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

这是函数(它HMAC来自 OpenSSL):

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_void_pc_char_p. 我得到了一些结果,但c_char_p代表以空字符结尾的字符串,因此结果在第一个 00h 处被剪切。如果HMAC结果中没有任何零,则它可以完美运行。但这仍然不能解决我的问题。

4

1 回答 1

2

用作ctypes.c_void_p返回类型通常是错误的做法。

对于非 nul 终止的字符串,您应该将其设置为正确大小的字符数组;32 在你的情况下,所以ctypes.c_char * 32. Therestype是指向 this 的指针,因此将其包装在ctypes.POINTER.

您可以bytes使用该指针value的.rawcontents

这是一个使用 的实际示例crypt(3),它返回一个 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'
于 2013-05-09T18:56:46.700 回答