1

我有一个 C 函数如下:

char* hash_id_G1(char *str){
char hash[20];
...
return hash;
}

我需要的是一些类似这里的函数,它将接收一个 char 数组并返回一个 char 数组或指向 char 的指针。

我会将它们编译成一个共享的so并使用ctypes将其导入python。

这就是我到目前为止所做的:

from ctypes import *
ibc = cdll.LoadLibrary('./libibc.so.1.0.1')
strin = 'sometext to hash'
ids = (c_char * 40)()
ids.value = strin
hash = c_char_p
hash_id = ibc.hash_id_G1
hash_id.restype = c_char_p
hash = hash_id(ids)

该库做得很好,但我无法设置 restype。当我这样做时,代码会因段错误而崩溃。

我需要从python中一一调用c库中的函数。这些函数通常返回加密。如何定义这些函数,以便它们接受来自 ctype 接口的字符串并以某种可存储的形式返回加密?

任何帮助表示赞赏。我对 C 指针和相关的东西非常薄弱。提前致谢

更新

分段错误是因为编译错误。如果函数要返回一个无符号字符,我将如何在 C 中声明 ctype 变量?

4

1 回答 1

2

不要这样传递你的论点;它容易出错且不惯用(因此难以阅读)。您可以执行以下操作:

from ctypes import *

ibc = cdll.LoadLibrary('./libibc.so.1.0.1')
ibc.hash_id_G1.restype = c_char_p
hash = ibc.hash_id_G1(c_char_p('sometext to hash'))

除此之外,您正在处理未定义的行为,因为您正在返回指向局部变量的指针。局部变量只存在于它们被声明的范围内;在该范围之外访问它们可以做任何事情,从返回虚假结果到段错误。如果更改编译器选项阻止您的代码出现段错误,那只能靠运气了。

解决这个问题的方法是声明你的数组,所以它甚至会在...static的范围之外持续存在hash_id_G1

char *hash_id_G1(char *str)
{
    static char hash[20];
    ...
    return hash;
}

...或显式分配内存。

char *hash_id_G1(char *str)
{
    char *hash = malloc(20);
    ...
    return hash;
}

第一个选项不是线程安全的(这对您的应用程序来说可能不是问题),第二个选项要求您free事后自己获取内存(或接受小的内存泄漏)。

至于您的新问题,请阅读文档

于 2013-03-04T15:23:03.030 回答