我有一个C函数如下:
char* hash_id_G1(char *str){
char hash[20];
...
return hash;
}
我需要的是一些像这里的函数,它将接受一个char数组并返回一个char数组或指向char的指针。
我将把它们编译成一个共享的,然后使用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)
该库运行良好,但我无法设置重定型。当我这样做时,代码崩溃了一个seg错误。
我需要从python中逐个调用c库中的函数。这些函数通常返回加密。如何定义这些函数,以便它们接受来自ctype接口的字符串并以某种可存储的形式返回加密?
感谢任何帮助。我对C指针和相关的东西很弱。提前致谢
更新
分段错误是由于编译错误造成的。如果函数返回unsigned char,我怎么必须在C?
中声明ctype变量答案 0 :(得分: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'))
除此之外,您正在处理未定义的行为,因为您正在返回指向局部变量的指针。局部变量仅存在于声明它们的范围内;在该范围之外访问它们可以做任何事情,从返回虚假结果到segfaulting。如果更改编译器选项会使代码停止在segfaulting中,那只能通过纯粹的运气。
解决这个问题的方法是声明你的数组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
内存(或接受小内存泄漏)。
关于您的新问题,read the documentation。