使用 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 http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/FAQ.html
但我真的看不出这有什么帮助,因为据我所知,这是 cython 的一项功能,而不是 python 的功能。
对于感兴趣的人来说,我需要这样做的原因是我正在使用 panda3d 和 kinect,并且 kinect c api 提供了一个 unsigned char * 值的数组,而 panda3d api 亲切地提供了一个 setPixels() 调用,该调用只需要一个python 字符串作为参数。