我正在尝试使用python ctypes从共享库中使用这两个C函数:
bool decompress_rgb(unsigned char *data, long dataLen, int scale)
float* getRgbBuffer()
第一个功能正常。我可以通过在共享库中放入一些调试代码并检查输入来判断。
问题在于获取数据。 RGB缓冲区是指向浮点的指针(显然),并且该指针在应用程序的生命周期内保持不变。因此,每当我想要解压缩图像时,我都会调用decompress_rgb
,然后需要查看getRgbBuffer
指向的位置的内容。我知道缓冲区大小是(720 * 288 * sizeof(float))所以我想这必须在某个地方发挥作用。
没有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的回答有效。
答案 0 :(得分:3)
尚未经过全面测试,但我认为这是沿着这条路线发展的:
buffer_size = 720 * 288 * ctypes.sizeof(ctypes.c_float)
rgb_buffer = ctypes.create_string_buffer(buffer_size)
ctypes.memmove(rgb_buffer, getRgbBuffer(), buffer_size)
Key是ctypes.memmove()
函数。来自ctypes documentation:
<强>
memmove(dst, src, count)
强>
与标准C memmove库函数相同:将count
个字节从src
复制到dst
。dst
和src
必须是可以转换为指针的整数或ctypes实例。
运行上述代码段后,rgb_buffer.value
会将内容返回到第一个'\0'
。要将所有字节作为python字符串,您可以对整个事物进行切片:buffer_contents = rgb_buffer[:]
。
答案 1 :(得分:2)
已经有一段时间了,因为我使用了ctypes而且我没有能够返回“double *”的东西来测试它,但如果你想要一个c_float_p:
c_float_p = ctypes.POINTER(ctypes.c_float)
阅读BastardSaint的回答,您只需要原始数据,但我不确定您是否这样做是为了解决没有c_float_p的问题。