加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何将具有0值字节的char *转换为python字符串?

发布时间:2020-12-16 23:28:54 所属栏目:Python 来源:网络整理
导读:使用ctypes模块我可以轻松地将POINTER(c_char)或c_char_p类型导入到 python中,但这些都没有提供一种方法来结束包含零值字节的python字符串. c_char_p为零终止,表示来自C的char *数组在第一个零值处终止. POINTER(c_char)是导入可以具有0值的二进制数据的推荐
使用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上转换640×480像素数据块大约需要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字符串作为参数.

解决方法

如上所述,使用POINTER(c_char)获取指向二进制数据数组的指针.要将它们组合成一个字符串,你可以只选择它,因为数组索引按照ctypes指针的预期工作:
clibblah = ctypes.cdll.LoadLibrary('clibblah.dylib')
get_pixels = clibblah.get_pixels
get_pixels.restype = ctypes.POINTER(ctypes.c_char)

pixels = get_pixels()
num_pixels = clibblah.get_pixel_length()

# Slice the ctypes array into a Python string
a = pixels[:num_pixels]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读