我试图使用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字节副本dstdstsrc必须是整数或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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top