0

我在 linux ubuntu 中有这个 C++ 代码我想通过 ctype 在 python 中使用这个方法,但不能将参数发送到 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)) ]

这一行创建了一个 Python 列表,其中包含一个 16 字节字符串缓冲区的地址(或者它可能不是字节而是字符,请自行查找)。

string_buffers[0]= "5555555555555555";

此行将上面的指针替换为字符串“555555555555555”。

dl.getuserdata(0,string_buffers,string_buffers2);

在这里,您将带有字符串的列表传递给函数,而函数接受指向字节的指针。问题是您想在这里实现什么,即是否要写入缓冲区。如果没有,请const在 C++ 中使用并简单地"22222"作为参数传递,ctypes 将自动为您完成其余的工作。

也就是说,可能是我猜错了,因为您没有解释到底发生了什么(引用错误消息!)以及您如何确定某些东西不起作用。此外,您应该清理损坏的 C++ 代码或暂时将其替换为更适合解释确切问题的更小的代码。

于 2013-07-02T05:43:43.617 回答