我正在为DLL编写Python ctypes包装器。
当事件发生时,DLL尝试使用以下原型调用回调函数:
void Function(u8 *Data, u16 Length)
基本上,它为我们提供了一个指向原始数据缓冲区的指针,以及该缓冲区的长度。
我正在尝试在python代码中找到一种接收和处理这些数据的方法。
如果我将ctypes函数类型声明为char指针:
TX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, c_char_p, c_int)
然后将数据视为空终止字符串,如果缓冲区中存在任何0x00字节,则会截断数据。
如果我将ctypes函数类型声明为void指针:
TX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, c_void_p, c_int)
然后我得到一个长整数值,我假设它是原始数据的地址 - 但我不知道如何检索数据以在Python中使用它。
如果我将ctypes函数类型声明为char:
的POINTERTX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, POINTER(char), c_int)
然后我得到一个ctypes.LP_c_char对象,但我无法弄清楚如何访问对象中的原始数据。
从包装的DLL返回的Python中访问原始数据的最佳方法是什么?
答案 0 :(得分:2)
你需要一个缓冲区:
>>> import ctypes
>>> b = ctypes.c_buffer("abc\0def", 16)
>>> b.value
'abc'
>>> b.raw
'abc\x00def\x00\x00\x00\x00\x00\x00\x00\x00\x00'
答案 1 :(得分:0)
要从ctypes.LP_c_char
切片获取数据。
def processBytes(pBuffer,len):<br>
<b>print(pBuffer[:len])</b>
CB_FUNC_TYPE = ctypes.CFUNCTION(None, ctypes.POINTER(ctypes.c_char),ctypes.c_int)<br>
cb_func = CB_FUNC_TYPE(processBytes)
//Need to setup cb_func in C <br>
//In C assign your call-back function<br>
void (*c_cb_func)(char *, int) = cb_func<br>
// Call your python function from C<br>
(c_cb_func)(pBuffer,len)