/ / python ctypes uint8バッファ使用 - python、ctypes

python ctypes uint8バッファ使用 - python、ctypes

正しい方法は何ですか(seg.faultを取得しています) uint8 バッファを次のように定義されたC関数に変換します。

void f(uint8* p, size_t len)

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

回答:

回答№1は2

あなたのコメントに入れた方法で作成された配列オブジェクト - (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)