Проблема со ссылками на код C из python с использованием ctypes - PullRequest
0 голосов
/ 06 мая 2019

Я пытался создать разделяемую библиотеку языка Си, на которую будут ссылаться из Python. Основная проблема заключается в том, что я мог получить только адрес указателя возврата на массив в C. Я попытался прочитать значение из возвращенного адреса, отправленного функцией C. Тем не менее, каждый подход, который я пробовал, вызывал сбой Python и не мог получить доступ к значению. Кто-нибудь может дать какие-то добрые советы?

path='../crypto_lib/vrf.so'

lib=CDLL(path)
sk = lib.new_sk()
print(sk)

output:292500480

Это код C, который я хочу использовать, который генерирует секретный ключ и возвращает его с шестнадцатеричным типом, преобразованным и сохраненным в shexbuf. Код - не моя собственная работа, имитирующая некоторые примеры на github, он прекрасно работает при компиляции с C. Предоставление ожидаемого вывода

char* new_sk(){

    uint8_t public_key[crypto_sign_PUBLICKEYBYTES];

    uint8_t secret_key[crypto_sign_SECRETKEYBYTES];

    static char shexbuf[2*crypto_sign_SECRETKEYBYTES+1];

    crypto_vrf_keypair(public_key, secret_key);
    char* result;
    result = to_hex(shexbuf, secret_key,  crypto_sign_SECRETKEYBYTES);
    return shexbuf;

}

Я ожидал получить значение секретного ключа, но я мог только получить что-то вроде адреса. Когда я попытался использовать ctype для чтения значения из адреса, неожиданно всплыло окно выхода из python

1 Ответ

0 голосов
/ 07 мая 2019

ctypes по умолчанию c_int для параметров и возвращаемого значения.Вы видите адрес возвращаемой строки как c_int.Установите .restype соответственно:

lib=CDLL(path)
lib.new_sk.restype = c_char_p
sk = lib.new_sk()
print(sk)
...