我有一个 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
函数会更容易编写。