在Python Ctypes回调中接收非空终止数据
我正在为一个DLL写一个Python的ctypes封装。
当发生某个事件时,DLL会尝试调用一个回调函数,这个函数的格式大致是这样的:
void Function(u8 *Data, u16 Length)
简单来说,它给我们一个指向原始数据的缓冲区的指针,还有这个缓冲区的长度。
我想找到一种方法,在我的Python代码中接收和处理这些数据。
如果我把ctypes函数类型声明为字符指针:
TX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, c_char_p, c_int)
那么数据会被当作一个以空字符结尾的字符串来处理,如果缓冲区中有任何0x00的字节,我就会得到截断的数据。
如果我把ctypes函数类型声明为无类型指针:
TX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, c_void_p, c_int)
那么我会得到一个长整型的值,我猜这是原始数据的地址,但我不知道怎么在Python中取出这些数据来使用。
如果我把ctypes函数类型声明为字符的指针:
TX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, POINTER(char), c_int)
那么我会得到一个ctypes.LP_c_char对象,但我不知道怎么访问这个对象中的原始数据。
在Python中,如何才能最好地访问从封装的DLL返回的原始数据呢?
2 个回答
1
要从一个 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)
3
你需要一个缓冲区:
>>> 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'