我有一个 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/