Я только начал с BitString и ctypes, и у меня есть часть двоичного файла, хранящегося в startdata
, BitArray
учебный класс.
> print(startdata)
0x0000000109f0000000010605ffff
Теперь я должен передать эти данные как есть функции C, которая принимает unsigned char *
в качестве аргумента, поэтому я сначала пытаюсь сделать что-то вроде этого:
buf = (c_ubyte * len(startdata))()
чтобы наконец сделать это:
buf_ptr = cast(pointer(buf), POINTER(c_ubyte))
Это работает, но как мне назначить байтовые данные из startdata
в этот массив / буфер, который я только что создал?
Это не работает:
> buf = (c_ubyte * len(startdata))(*startdata.bytes)
TypeError: an integer is required
Вот возможное решение (обратите внимание, что я использую Python 3):
import ctypes
def bitarray_to_ctypes_byte_buffer(data):
"""Convert a BitArray instance to a ctypes array instance"""ba = bytearray(data.bytes)
ba_len = len(ba)
buffer = (ctypes.c_uint8 * ba_len).from_buffer(ba)
return buffer
(Примечание: то же самое относится к преобразованию bytes
экземпляр к байтовому массиву ctypes, просто удалите .bytes
в data.bytes
).
Затем вы можете передать буфер вашей функции C, используя byref
:
byref(buffer)