У меня есть поле 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]
, где foo
- это POINTER(c_char)
, взрывается с TypeError: 'c_char' object is not subscriptable
. Я могу напечатать первый символ строки байтов, используя либо print(foo)
, либо print(foo[0])
Я былдумая, что ctypes.cast
может работать, однако я не знаю, как передать ему длину приведения (как интерпретировать первые N байтов адреса foo как 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
написана более легко.