Ctype в питоне

у меня есть этот код 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";

0

Решение

Давайте посмотрим на код …

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 ++ или временно заменить его чем-то меньшим, что больше подходит для точного объяснения проблемы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector