python: ctypes,在 python 中读取 POINTER(c_char)

2023-12-05

我有一个 ctypes 字段,它是POINTER(c_char)(根据文档,c_char_p 必须对我的应用程序不起作用:https://docs.python.org/3.7/library/ctypes.html#ctypes.c_char_p)

对于也可能指向二进制数据的通用字符指针,必须使用 POINTER(c_char)。

然而,ctypes 本身推荐的这种用法似乎有一个缺点,它声称是指向单个字符的指针,但事实并非如此,它是指向字节数组的指针。

我如何读取 ctypes 函数返回的数组(我知道length)在Python中?尝试像这样索引它foo[0:len] where foo is a POINTER(c_char)爆炸了TypeError: 'c_char' object is not subscriptable

我可以使用以下任一方法打印字节串的第一个字符print(foo) or print(foo[0])

我在想ctypes.cast可能有用,但是我不知道如何传递它的转换长度(如将地址 foo 的前 N ​​个字节解释为bytes object)

编辑:一些代码。

所以我有一个结构:

class foo(Structure):
_fields_ = [("state", c_int),
            ("type", c_int),
            ("len", c_int),
            ("payload", POINTER(c_char))]  # according to th following the python bytes are already unsinged https://bytes.com/topic/python/answers/695078-ctypes-unsigned-char

我还有另一个函数返回一个POINTER(foo)

lib3 = CDLL(....so)
f = lib3.f
f.restype = POINTER(foo)

I call f,它返回一个POINTER(foo):

ptrf = f(....)

然后我试图访问ptrf.payload。以下代码有效:

def get_payload(ptr_to_foo):

    val = cast(ptr_to_foo.contents.payload, c_char_p).value
    return val[:ptr_to_foo.contents.len]

So I do

 ptrf = f(....)
 get_payload(ptrf)

我想知道是否get_payload函数会更容易编写。


如果你真的有一个POINTER(c_char)类型,它是可下标的。将来提供重现您的问题的代码:

>>> p = cast(create_string_buffer(b'Hello, world!'),POINTER(c_char))
>>> p
<ctypes.LP_c_char object at 0x000001C2F6B58848>
>>> p[0]
b'H'
>>> p[:14]
b'Hello, world!\x00'
>>> cast(p,c_char_p).value  # only if known to be nul-terminated
b'Hello, world!'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python: ctypes,在 python 中读取 POINTER(c_char) 的相关文章

随机推荐

  • 如何在 R 中跨多列应用 ifelse 函数并创建新列

    我想在数据集的多个列上应用 ifelse 函数并创建新的 重新评分 列 这是一个示例数据集 data data frame year 2021 month sample x c 1 12 size 10 replace TRUE C1 sa
  • 如何更改 Shiny 中的“超出最大上传大小”限制并保存用户文件输入?

    我最近了解到 R Shiny 程序默认对文件上传施加最大大小限制 我不知道具体大小是多少 但我猜是 5 000 KB 我想取消这个限制 我该如何做到这一点 对于用户上传的大小有什么一般的经验法则 此外 这是另一个注释 但相关的是 如何保存用
  • 比较两个表,查找缺失行和不匹配的数据

    我想比较两个表并获得一组结果 其中查找值不匹配以及另一个表中缺少键值 第一部分适用于以下查询 SELECT FROM SELECT mID mLookup FROM m t1 FULL OUTER JOIN SELECT aID aLook
  • Array() 的文档在哪里? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 正在浏览ruleby源代码 我注意到他们正在调用容器 和 这是我很少见到的 事实上 我唯一见过的地方就是制造宝石 快速浏览表明容器子类Array 然
  • 如何解决错误“java.net.ConnectException:无法连接到 localhost/127.0.0.1:8000”

    我目前正在开发一个应用程序android studio with Kotlin和一个API系统使用django rest framework 我想访问我的本地服务器127 0 0 1使用 android 模拟器从 API 方法中获取一些值
  • 使用 IO 在 C# 中读取十六进制

    我正在从 C 转向 Java 但似乎找不到任何相关信息 我正在尝试读取使用十六进制的文件 在Java中我使用 String s Integer toHexString hexIn if s length lt 2 s 0 Integer t
  • SVG 文件中的 JavaScript

    我有一个特殊请求 因为我想直接在 SVG 文件内生成 SVG 到目前为止 我已经使用生成 SVG 标签编写了以下代码 但屏幕上没有显示任何内容 我可能做错了什么 但我不知道在哪里 因为它不会引发任何错误
  • WPF中有没有类似Visual Studio工具箱的控件?

    我正在使用 WPF 编写一个应用程序 我需要制作一些看起来像 Visual Studio 工具箱的东西 请参见图片 我应该为此使用什么控件 我想你正在寻找类似的东西AvalonDock
  • ResultSet.getString(Date) 根据驱动程序而有所不同

    我正在使用 Oracle Database 11g 企业版版本 11 2 0 2 0 64 位生产 具有分区 OLAP 数据挖掘和实际应用程序测试选项 我有一个表 其架构是 COLUMN NAME DATA TYPE DATA TYPE M
  • R中带有if语句的线性回归[重复]

    这个问题在这里已经有答案了 我有一个虚拟变量black where black 0是白色的并且black 1是黑色的 我正在尝试拟合线性模型lm为了black 1仅类别 但是运行下面的代码给出了不正确的系数 R 有没有办法运行一个模型if语
  • 将图像/文本文件从 Android 发送到 Web 服务器(本地主机)

    我对 Android 编程非常陌生 我的任务是将图像和文本数据发送到 Web 服务器 本地主机 但是我已经尝试了很多代码来完成这项工作 它们都不起作用 每当我尝试执行代码时 我的应用程序就会崩溃 因此我决定调试代码并查看问题所在 然后我发现
  • Github Actions:关于 set-output 的警告,但不使用它

    我正在使用 GitHub 操作 构建 Python 应用程序 运行 linting 代码覆盖率和测试 在操作结束时 我收到以下警告 1 warning build The set output command is deprecated a
  • 添加边缘以散点图标记

    我正在用 python 制作 matplotlib 绘图 我有一个标记就是我 使用以下方法将其放在绘图上 plt scatter x position y position c z position cmap cm bwr marker x
  • 将多个列表框项目添加到数据库

    Is there any easy way to save the items in listbox to the database I am using access database for windows form where use
  • 如何使用 LINQ to Objects 安排作业而不重叠?

    这是另一个资源分配问题 我的目标是运行一个查询 将任何时隙的最高优先级作业分配给两个 CPU 核心之一 只是一个示例 所以我们假设没有中断或多任务处理 注意 这类似于我之前关于分区的文章 但重点关注重叠时间和分配多个项目 而不仅仅是最优先的
  • 删除 ng-bind-html-unsafe 后,如何注入 HTML?

    我正在尝试使用 sanitize提供者和ng bind htm unsafe指令允许我的控制器将 HTML 注入到 DIV 中 但是 我无法让它工作 div div 我发现这是因为它已从 AngularJS 中删除 谢谢 但没有ng bin
  • 紧密循环中虚拟函数的成本

    我所处的情况是 我的游戏对象具有虚拟函数 Update 有很多游戏对象 目前略多于 7000 个 并且循环调用所有这些对象的更新 除其他外 我的同事建议我们应该完全删除虚函数 正如您可以想象的那样 这将需要大量的重构 我见过这个答案但就我而
  • 有没有办法抑制 Firebase Functions Firestore 触发器?

    我在用聚合用于跟踪 Firestore 中聚合数据 例如文档总数等 的技术 每当article创建或删除文档时 我正在使用 Firebase 函数的触发器来更新单独文档中的聚合数据 exports onCreateArticle funct
  • Python Minidom XML 查询

    我正在尝试使用 lxml 查询此 XML
  • python: ctypes,在 python 中读取 POINTER(c_char)

    我有一个 ctypes 字段 它是POINTER c char 根据文档 c char p 必须对我的应用程序不起作用 https docs python org 3 7 library ctypes html ctypes c char