2012-02-09 20 views
0

私はctypes経由でPython関数を呼び出しているDLLにC関数を持っています。Pythonに渡されたCバッファへのデータの追加Ctypesコールバック

void GetData(u8 Buffer[], u16 Length); 

なお、DLLに保持されている静的データアレイにバッファポイント:

C関数は、次のプロトタイプを持つ関数を呼び出します。

私は次のように、このためのPythonの関数型を生成した:

CFUNCTYPE(None, c_char_p, c_int) 

そして、私のPythonのコールバック関数は、任意の明白な問題なしで呼び出されています。

私の問題は、ctypesにPythonの外部にあるバッファに生のデータを追加する方法を教えてもらえません。 ctypes文字列バッファを定義し、それにDLLのバッファのアドレスを与える方法はありますか?

答えて

2

libcのmemcpyを使用できます。あなたのc_char_pbufferc_intある場合bufferlenです:

あなたは私が可能バイナリコンテンツ用のmemcpyを使用しましたが、あなたはそれを気にしない場合は、使用C.( ノートでやるのと同じ
libc = ctypes.cdll.LoadLibrary('libc.so.6') 
content = 'My new content' 
bufcontent = ctypes.create_string_buffer(content) 
libc.memcpy(buffer. newcontent, min(len(content) + 1, bufferlen)) 

strncpy代わり

+2

あなたの答えをありがとう - あなたは本当に右のラインに沿って私を指摘: - 私はlibcのをインポートする必要はありませんでした - 私は、ctypesのはmemcpyををラップMEMMOVE機能を持っていることが分かりました。 CFUNCTYPE(None、c_char_p、c_int)ではなく、CFUNCTYPE(None、POINTER(c_char)、c_int)として関数型を宣言することが唯一必要なことです。 –

関連する問題