4

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

4

2 回答 2

4

没有完全测试,但我认为这是沿着这条线的东西:

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字节从复制srcdst. dst并且src必须是可以转换为指针的整数或 ctypes 实例。

运行上述代码段后,rgb_buffer.value将返回内容直到第一个'\0'. 要将所有字节作为 python 字符串获取,您可以对整个内容进行切片:buffer_contents = rgb_buffer[:].

于 2009-04-01T10:39:03.153 回答
2

自从我使用 ctypes 已经有一段时间了,我没有返回“双 *”的东西,足以方便地测试它,但如果你想要一个 c_float_p:

c_float_p = ctypes.POINTER(ctypes.c_float)

阅读 BastardSaint 的答案,您只需要原始数据,但我不确定您是否将其作为没有 c_float_p 的解决方法。

于 2009-04-01T14:18:53.640 回答