python ctypes uint8缓冲区用法

met*_*ete 5 python ctypes

什么是正确的方法(我得到seg.fault)发送uint8缓冲区到C函数定义为:

void f(uint8* p, size_t len)

_lib.f.argtypes=[ctypes.POINTER(ctypes.c_ubyte), ctypes.c_uint] 
Run Code Online (Sandbox Code Playgroud)

jsb*_*eno 2

通过您在评论中放入的方式创建的数组对象 -(cbytes.c_ubyte * 256)()很好。但在 ctypes“行话”中,这个对象并不等于 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)
Run Code Online (Sandbox Code Playgroud)