使用Python的ctypes得到彩车缓冲从共享库到Python字符串
-
22-08-2019 - |
题
我试图使用Python ctypes的使用这两个C函数从共享库:
bool decompress_rgb(unsigned char *data, long dataLen, int scale)
float* getRgbBuffer()
在第一功能工作正常。我可以通过将一些调试代码在共享库和检查输入告诉。
的问题是出获取数据。的RGB缓冲器是一个指向一个浮子(明显)和该指针应用程序的生命周期内保持不变。所以每当我想解压缩的图像,我叫decompress_rgb
然后需要看什么是在该位置通过getRgbBuffer
指向。我知道,缓冲区大小为(720 * 288 *的sizeof(浮动)),所以我想这已经开始发挥作用的地方。
有没有c_float_p
类型,所以我想我会尝试这样的:
getRgbBuffer.restype = c_char_p
然后我做的:
ptr = getRgbBuffer()
print "ptr is ", ptr
刚刚输出:
ptr = 3078746120
我猜是这样的实际地址,而不是内容,但即使我成功地取消引用指针和获取内容时,它只会是第一个字符。
我怎样才能得到整个缓冲区的内容转换为Python字符串?
修改强>不得不改变:
getRgbBuffer.restype = c_char_p
到
getRgbBuffer.restype = c_void_p
但随后BastardSaint的回答工作。
解决方案
不完全测试,但我认为这是沿着这条线的东西:
buffer_size = 720 * 288 * ctypes.sizeof(ctypes.c_float)
rgb_buffer = ctypes.create_string_buffer(buffer_size)
ctypes.memmove(rgb_buffer, getRgbBuffer(), buffer_size)
关键是ctypes.memmove()
功能。从 ctypes的文档:
<强>
memmove(dst, src, count)
强>结果 同标准C的memmove库函数:从count
src
字节副本dst
。dst
和src
必须是整数或ctypes的实例,可以被转换成指针。
上面的片段运行之后,rgb_buffer.value
将返回的内容,直到所述第一'\0'
。要获得所有字节为Python字符串,你可以切片的整个事情:buffer_contents = rgb_buffer[:]
其他提示
这已经有一段时间,因为我用的ctypes和我没有的东西,它返回一个“双*”足够方便测试了这一点,但如果你想有一个c_float_p:
c_float_p = ctypes.POINTER(ctypes.c_float)
阅读BastardSaint的回答,你只是想的原始数据,但我不知道,如果你正在做的,作为一种变通方法不具有c_float_p。