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

1 投票
2 回答
2456 浏览
提问于 2025-04-17 11:14

我正在为一个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'

撰写回答