在Python Ctypes回调中接收非Null-Terminated数据

时间:2012-01-27 17:11:11

标签: python ctypes

我正在为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:

的POINTER
TX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, POINTER(char), c_int)

然后我得到一个ctypes.LP_c_char对象,但我无法弄清楚如何访问对象中的原始数据。

从包装的DLL返回的Python中访问原始数据的最佳方法是什么?

2 个答案:

答案 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)