2013-03-04 92 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