向传递给Python Ctypes回调的C缓冲区添加数据
我在一个DLL里有个C语言的函数,它通过ctypes调用了一个Python的函数。
这个C函数调用的函数有以下的格式:
void GetData(u8 Buffer[], u16 Length);
需要注意的是,这个缓冲区指向的是一个在DLL里保存的静态数据数组。
我为这个函数在Python里生成了一个函数类型,格式如下:
CFUNCTYPE(None, c_char_p, c_int)
而且我的Python回调函数被调用时没有明显的问题。
我遇到的问题是,我不知道怎么让ctypes把原始数据添加到一个Python外部的缓冲区里。有没有办法定义一个ctypes字符串缓冲区,并把它的地址指向DLL里的缓冲区呢?
1 个回答
2
你可以使用来自libc的memcpy
函数。如果你的c_char_p
是buffer
,而c_int
是bufferlen
:
libc = ctypes.cdll.LoadLibrary('libc.so.6')
content = 'My new content'
bufcontent = ctypes.create_string_buffer(content)
libc.memcpy(buffer. newcontent, min(len(content) + 1, bufferlen))
这和你在C语言中做的事情是一样的。(注意,我使用了memcpy是因为可能会处理二进制内容,但如果你不在乎这些,可以用strncpy
来代替)