2013-03-04 91 views
1

我有如下C函数:的交流功能CTYPE返回类型

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

我需要的是像这里的一个部分功能,将采取在字符数组,并返回一个字符数组或指针到字符。

我将这些编译成共享,然后使用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。当我这样做时,代码崩溃了seg故障。

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

任何帮助表示赞赏。我用C指针和相关的东西很弱。在此先感谢

UPDATE

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

+0

hash_id_G1()函数返回什么?它是以空字符结尾的字符串还是固定的已知大小的字符串?在后一种情况下,您需要将restype声明为'POINTER(c_char * 40)'。 – 2013-03-04 09:00:48

+0

我已更新代码@armin。如图所示,它返回指向char数组的指针。 – Ajoy 2013-03-04 09:41:47

+0

看起来分割问题是由于编译时一些不好的选项造成的。该代码产生预期的结果。我已更新我的帖子。 – Ajoy 2013-03-04 10:00:57

回答

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记录自己之后(或接受一个小的内存泄漏)。

至于你的新问题,read the documentation