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

2023-12-31

使用 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 字符串作为参数。


正如你所说,使用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]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 由 tycho maven 将 JRE 与基于 RCP 插件的应用程序捆绑在一起

    我有基于插件模型的 RCP 应用程序 我想将 JRE 放入 Maven Tycho 创建的最终工件中 我尝试遵循这些建议 在第谷构建中包含一个 jre https codeiseasy wordpress com 2012 07 31 in
  • 保存后会在“我的文档”中创建 Excel Addin 的副本

    我有一个应用程序 在 IBM Notes 中运行 使用 Lotusscript 等 它通过 OLE 自动化创建一个新的 Excel 对象 在我的应用程序中 我创建一个新的工作簿并将其保存到临时文件夹 我将其另存为不带宏的 Excel 工作表
  • HTML5 语音输入和 Google Translate 文本转语音,Chrome 中的问题

    我正在创建一个语音 文本备忘录 Web 应用程序 这里 http gustavstromberg se sandbox html5 localstorage http gustavstromberg se sandbox html5 loc
  • awk 命令在 Snakemake --use-singularity 中失败

    我正在尝试将 Snakemake 与 Singularity 结合起来 我注意到一个简单的awk使用奇点时命令不再起作用 这 1最后一行被 bash 替换 而不是被用作第一个字段awk 这是一个最小的工作示例 蛇形锉刀 singularit
  • Elasticsearch - 模糊、短语、完成建议和破折号

    因此 我一直在问单独的问题 试图实现我想要实现的搜索功能 但仍然达不到要求 所以我想我只会问人们他们对最佳 Elasticsearch 设置 映射 索引和查询结构的建议 以完成我正在寻找的工作为了 当您键入查询类别的解决方案时 我需要进行搜
  • 是否可以编译unittest而不运行它们并为特定模块显式运行unittest?

    我经常在开发 API 时在主函数中编写测试代码 但因为 D 集成了单元测试 所以我想开始使用它们 我当前的工作流程如下 我有一个脚本可以监视任何 d 文件中的文件更改 如果脚本找到修改过的文件 它将运行dub build 问题是dub bu
  • 在 tabcontrol C# 中显示多个数据表

    我有一个小程序 需要一个数据表 从sql数据库获取数据 然后按字段将其拆分为数据表数组 然后应将其显示在选项卡控件中 每个字段都在其自己的选项卡中 分割 采用单个数据表并分割成数据表数组 我认为工作正常 public DataTable s
  • 如何模拟 REST API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 MVC 应用程序需要调用第三方供应商的 REST API REST API 应该返回 JSO
  • 是否有重新启动集群的最佳实践

    我遵循亚历克斯埃利斯的优秀tutorial https gist github com alexellis fdbc90de7691a1b9edb545c17da2d975使用kubeadm在 Raspberry Pi 上启动 K8s 集群
  • Gitignore 不忽略文件夹

    我已将多个文件夹添加到我的 gitignore文件 但当我这样做时它们仍然出现git status 我的安装 计算机是新的 我正在尝试在 svn 中初始化 git 存储库 正如我之前所做的数百次一样 尽管不是在这台机器上 文件夹被标记为忽
  • 如何在 ActiveMQ 5.2 中打开 JMX

    在 ActiveMQ 5 2 中启用 JMX 的正确方法是什么 我见过相互冲突的文档 所以我想知道是否有人知道正确的配置文件更改应该是什么 我想我可以通过更改用于启动 ActiveMQ 的批处理文件来使其工作 但我真的不知道
  • Android应用程序中的语音检测

    描述 我的应用程序记录手机麦克风的声音 我正在使用 android 标准类 android media AudioRecord 要做到这一点 应用程序有 2 个按钮 Start and Stop 当我按下start按钮应用程序开始记录 当我
  • 根据色调名称更改条形颜色

    我在用着seaborn and pandas从不同 但相关 的数据创建一些条形图 这两个数据集共享一个共同的类别 用作hue 因此我想确保在两个图表中该类别的条形颜色匹配 我该怎么办 一个基本的例子如下 import seaborn as
  • Oracle SQL:导出到 CSV 避免换行

    我需要批量导出每天 csv 文件中数据库的一些数据 实际上 我正在使用 SET COLSEP 命令 但在导出大小为 4000 VARCHAR2 4000 的大列时遇到一些问题 它在输出文件上返回给我许多空行和换行符 我将尝试用一个例子更好地
  • Visual Studio SSIS 项目 - 脚本任务生成错误

    我想学习在我的个人计算机上开发 SSIS 包 我对编写 C 脚本感兴趣 我使用 SSDT 在 Windows 10 Pro 64 位上安装了 Visual Studio 2019 还安装了 Integration Services Proj
  • PhpMyAdmin:“处理请求时出错:”(未显示错误)

    我在 Windows 10 64 位 上运行 XAMPP 作为开发环境 PhpMyAdmin 最近开始回复每一次尝试的操作 并出现以下错误 没有任何有关该错误的实际信息 我怎样才能继续前进而不收到错误 不起作用的行动 删除行 删除表 Edi
  • 在 Javascript 中启用和禁用 Div 及其元素[重复]

    这个问题在这里已经有答案了 我正在寻找一种方法启用和禁用这div id dcalc 和它的孩子 div class nerkheArz style width 380px height 370px background CDF text a
  • Bash 参数替换中 :- 和 := 有什么区别?

    Bash 参数替换中 和 有什么区别 他们似乎都设置了默认值 Quoting Bash 参考手册 https www gnu org software bash manual bashref html Shell Parameter Exp
  • 如何诊断 Java 8 元空间泄漏?

    我有一个具有一些有趣行为的 J2EE 应用程序 堆似乎表现良好 随着时间的推移 随着垃圾收集的进行而增长和收缩 总体上没有明显的长期堆扩展 然而 元空间一直以每小时 20 Mb 左右的速度稳定增长 直到达到 MaxMetaspace 并遇到
  • 如何将具有 0 值字节的 char * 转换为 python 字符串?

    使用 ctypes 模块 我可以轻松地将 POINTER c char 或 c char p 类型导入到 python 中 但这两种方法都没有提供一种方法来最终得到包含零值字节的 python 字符串 c char p 以零终止 这意味着