使用 ctypes 模块,我可以轻松地将 POINTER(c_char) 或 c_char_p 类型导入 python,但它们都没有提供一种方法来结束包含零值字节的 python 字符串。
c_char_p 以零结尾,这意味着来自 C 的 char * 数组在第一个零值处终止。
POINTER(c_char) 是导入可以具有 0 值的二进制数据的推荐方法,但似乎没有办法直接将其转换为 python 字符串。
我可以做这个:
pixels = clibblah.get_pixels()
a = ""
for i in range(0, clibblah.get_pixel_length()):
a += pixels[i]
...但是这 1) 看起来不是很 Pythony,并且 2) 需要很长时间(在我的 Mac 上转换 640x480 像素数据块大约需要 2 秒)。
我在堆栈溢出时看到了很多关于这个的问题,但是如果我能看到一个不是人们会说的“你为什么需要这样做?” 或“c_char_p 会做你想做的事”(它不会,正如我上面所描述的)。
我见过的唯一可靠的建议是使用 c api PyString_FromStringAndSize,如下所示:http: //www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/FAQ.html
不过,我真的看不出这有什么帮助,因为 afaik 这是一个 cython 功能,而不是 python 功能。
对于感兴趣的人,我需要这样做的原因是我正在使用 panda3d 和 kinect,而 kinect c api 提供了一个 unsigned char * 值数组,而 panda3d api 亲切地提供了一个 setPixels() 调用,它只需要一个python字符串作为参数。