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

标签 python ctypes

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

For a general character pointer that may also point to binary data, POINTER(c_char) must be used.

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

如何在Python中读取ctypes函数返回的数组(我知道长度)?尝试像 foo[0:len] 那样对其进行索引,其中 foo 是一个 POINTER(c_char) 会因 TypeError: 'c_char 而爆炸' 对象不可订阅

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

我在想 ctypes.cast 可能会工作,但是我不知道如何向它传递强制转换的长度(例如将地址 foo 的前 N ​​个字节解释为 字节对象)

编辑:一些代码。

所以我有一个结构:

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)

我调用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]

所以我愿意

 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!'

关于python: ctypes,在 python 中读取 POINTER(c_char),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55103298/

相关文章:

python - 堆叠从 Xarray 生成的 Dask 数组的有效方法

python - 如何知道函数返回类型和参数类型?

ocaml - 使用 Ctypes 和 Foreign 从 OCaml 将字符串传递给 C 库

python - 使用ctypes将字符串从python传递到c++-仅发送第一个字符

python - super() 对象的动态方法解析

python - 更改 Django-Mezzanine-Cartridge From - 下订单后的电子邮件

python - Selenium 在生产中仅在 headless 模式下工作是真的吗? ( Django )

python - 在 32 位库中使用 python ctypes

Python ctypes .dll 函数(pari 库)

c++ - 为什么这个 extern "C"函数不能使用 python ctypes?