向传递给Python Ctypes回调的C缓冲区添加数据

1 投票
1 回答
2126 浏览
提问于 2025-04-17 12:42

我在一个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_pbuffer,而c_intbufferlen

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来代替)

撰写回答