у меня есть этот код C ++ в Linux Ubuntu я хочу использовать этот метод в 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";
Давайте посмотрим на код …
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 ++ или временно заменить его чем-то меньшим, что больше подходит для точного объяснения проблемы.
Других решений пока нет …