0

Linux ubuntu にこの C++ コードがあります。Python で ctype を使用してこのメ​​ソッドを使用したいのですが、パラメータを ctype.cdl.funcion に送信できません。

C++ コード:

extern "C"  unsigned char* getuserdata(int code,unsigned char* globalkey,unsigned char* key)
{
        unsigned char data[256];
        KeyA *keya;         
        keya=new KeyA;
        keya->OpenDevice(0);
        keya->Init(globalkey,globalkey,globalkey,globalkey);
        keya->ReadUserMemory( 0,256,key,data);
        return data;    
 }

C++ でこの関数を使用するサンプル:

 unsigned char g_user[16] = { 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22 };
 unsigned char publickey[16] = { 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55 };
 printf("function Return: %s\n", getuserdata(0,publickey,g_user));

そして私のpythonソースコード(動作していません!!)は次のとおりです。

from ctypes import *
dl=cdll.LoadLibrary('/home/iman/KCore/kcore/hkey.so');
dl.getuserdata.restype = c_char_p
string_buffers = [addressof(create_string_buffer(16)) ]
string_buffers[0]= "5555555555555555";
string_buffers2 = [addressof(create_string_buffer(16)) ]
string_buffers2[0]="2222222222222222";
st= dl.getuserdata(0,string_buffers,string_buffers2);
print st+"\n";
4

1 に答える 1

1

コードを見てみましょう...

string_buffers = [addressof(create_string_buffer(16)) ]

この行は、16 バイトの文字列バッファーのアドレスを含む Python リストを作成します (または、バイトではなく文字である可能性があります。自分で調べてください)。

string_buffers[0]= "5555555555555555";

この行は、上記のポインタを文字列「555555555555555」に置き換えます。

dl.getuserdata(0,string_buffers,string_buffers2);

ここでは、文字列を含むリストを関数に渡しますが、関数はバイトへのポインターを受け取ります。問題は、ここで達成したいこと、つまり、バッファに書き込みたいかどうかです。そうでない場合は、constC++ で使用し、単に"22222"パラメーターとして渡すだけで、ctypes が残りを自動的に行います。

そうは言っても、正確に何が起こっているのか (エラーメッセージを引用してください!) と、何かが機能しないとどのように判断したかを正確に説明していないため、私が間違っていると推測している可能性があります。さらに、壊れた C++ コードをクリーンアップするか、正確な問題を説明するのに適した小さなコードに一時的に置き換える必要があります。

于 2013-07-02T05:43:43.617 に答える