python ctypes uint8缓冲区用法

时间:2012-02-04 19:55:14

标签: python ctypes

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

void f(uint8* p, size_t len)

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

1 个答案:

答案 0 :(得分: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)