/ / python ctypes uint8 използване на буфер - python, ctypes

- използване на буфер - python, ctypes

Какъв е правилният начин (аз получавам seg.fault), за да изпратите uint8 буфер към C функция, дефинирана като:

void f(uint8* p, size_t len)

_lib.f.argtypes=[ctypes.POINTER(ctypes.c_ubyte), ctypes.c_uint]

Отговори:

2 за отговор № 1

Масивите обекти, създадени по начина, по който поставяте коментара си - (cbytes.c_ubyte * 256)() са добре. Но в ctypes "jargon" този обект не е еквивалентен на ctypes.POINTER (ctypes.c_ubyte) - ctypes трябва да ви предупреди, когато се опитате да извикате функцията с масива като параметър.

Както и да е, вероятно, когато преминете създадения масивкато параметър, ctypes не препраща към неговото съдържание, а на друго нещо към C (може би адреса на Python обекта, а не на неговото съдържание).

Ако насочите указател към съдържанието на масива към типа на POINTER, който сте създали, вероятно ще работи:

pointer_type = ctypes.POINTER(ctypes.c_ubyte)
_lib.f.argtypes=[pointer_type), ctypes.c_uint]
data_block = (ctypes.c_ubyte * 256)()
pointer = ctypes.cast(ctypes.addressof(data_block, pointer_type))
_lib.f(pointer, 256)