【发布时间】:2019-08-01 20:27:08
【问题描述】:
我有一个 ctypes 字段,它是 POINTER(c_char)(根据文档,它必须是 c_char_p 不适用于我的应用程序:https://docs.python.org/3.7/library/ctypes.html#ctypes.c_char_p)
对于也可能指向二进制数据的通用字符指针,必须使用 POINTER(c_char)。
但是,ctypes 本身推荐的这种用法似乎有一个缺点,它声称是指向单个字符的指针,但实际上不是,它是指向字节数组的指针。
如何在 Python 中读取 ctypes 函数(我知道 length)返回的数组?尝试像foo[0:len] 那样对其进行索引,其中foo 是POINTER(c_char) 与TypeError: 'c_char' object is not subscriptable 爆炸
我可以使用print(foo) 或print(foo[0]) 打印字节串的第一个字符
我在想ctypes.cast 可能会起作用,但是我不知道如何将强制转换的长度传递给它(如将地址 foo 的前 N 个字节解释为 bytes 对象)
编辑:一些代码。
所以我有一个结构:
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 函数是否会更容易编写。
【问题讨论】:
-
你能分享一些代码/细节(如何调用 func 传递给它的参数,谁分配数组)?也许整个方法是错误的。您得到的 TypeError 表示 foo 是一个 c_char (不是指针)。我能够索引一个
ctypes.LP_c_char(它是从一个字符数组创建的)。 -
@CristiFati 问题已更新以包含更多代码