使用python ctypes从共享库中获取浮点缓冲区到python字符串

时间:2009-04-01 09:34:41

标签: python pointers return-value ctypes

我正在尝试使用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的回答有效。

2 个答案:

答案 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复制到dstdstsrc必须是可以转换为指针的整数或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的问题。