在Python Ctypes回调中接收非空终止数据

在Python Ctypes回调中接收非空终止数据,python,ctypes,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) 然后将数据视为以null

我正在为DLL编写Python ctypes包装器

当事件发生时,DLL尝试使用以下原型调用回调函数:

void Function(u8 *Data, u16 Length)
本质上,它为我们提供了一个指向原始数据缓冲区的指针,以及该缓冲区的长度

我试图在python代码中找到一种接收和处理这些数据的方法

如果我将ctypes函数类型声明为char指针:

TX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, c_char_p, c_int)
然后将数据视为以null结尾的字符串,如果缓冲区中存在任何0x00字节,则会得到截断的数据

如果我将ctypes函数类型声明为空指针:

TX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, c_void_p, c_int)
然后我得到一个长的整数值,我假设它是原始数据的地址——但我不知道如何检索数据以在Python中使用它

如果我将ctypes函数类型声明为指向char的指针:

TX_CALLBACK_FUNC_TYPE = CFUNCTYPE(None, POINTER(char), c_int)
然后我得到了一个ctypes.LP_c_char对象,但我不知道如何访问该对象中的原始数据

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

您需要一个缓冲区:

>>> 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'

要从
ctypes.LP_c_char
中获取数据,只需将其切片即可

def processBytes(pBuffer,len):
打印(pBuffer[:len]) CB_FUNC_TYPE=ctypes.CFUNCTION(无,ctypes.POINTER(ctypes.c_char),ctypes.c_int)
cb_func=cb_func_类型(processBytes) //需要在C中设置cb_func
//在C中分配回拨功能
void(*c_cb_func)(char*,int)=cb_func
//从C调用python函数
(c_cb_func)(布弗,len)
感谢您在这方面的帮助。我使用的是缓冲区,但我的错误使用的是.value而不是.raw。还要注意的是,c_buffer似乎已被弃用,取而代之的是create_string_buffer。
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)