2016-12-28 1 views
3

私はC言語を学び、pythonパッケージctypesを使用してより高いパフォーマンスを得るために.soをPythonファイルにインポートしようとしています。 .soファイルから返された文字列を取得しようとするときに苦労するまで、すべてうまくいった。Python ctypesは.soファイルから返された長い文字列値を取得できません

Cコード:

char *convert_to_16(char *characters, int n){ 

    char sub_buffer[3]; 
    char code[3]; 
    char *buffer = (char*)malloc(sizeof(characters) * 2); 
    for(int i=0; i < n; i++){ 
     strncpy(code, characters+i, 1); 
     sprintf(sub_buffer, "%x", *code); 
     strncat(buffer, sub_buffer, 2); 
    } 
    return buffer; 
} 

// main() only for test 
int main(){ 
    char param[] = "ABCDEFGHTUIKLL"; 
    printf("%s\n", param); 
    int length = strlen(param); 
    printf("%s\n", convert_to_16(param, length)); 
} 

これは出力とよく実行:

41424344454647485455494b4c4c

Pythonコード:

私は、公式ドキュメントを読んで、ctypes.c_char_pとしてRESTYPEを設定し、他の値に設定しようと

それは動作しますが、2文字のみを返します。 。しかし、それが唯一の選択肢だと思われますが、奇妙なことに2文字しか返されませんでした。

私のctypes設定の問題か、Cが正しく書かれていないのですか? 多くのありがとうございます。

+0

@Stargateurありがとう!私はもっ​​と割り当てる必要があります。 – Castor

答えて

3

私はPythonでctypesについてよく分かりませんが、c_char_p("ABCDEFGHTUIKLL")のような文字列を作成する必要があります。

そしておそらくこれはCであなたの未定義の動作を修正するあなたの機能c_convert_to_16.argtypes = [c_char_p, c_size_t]

を取るどのような引数を伝える:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *convert_to_16(char const *array, size_t const len); 

char *convert_to_16(char const *array, size_t const len) { 
    size_t const len_buffer = len * 2 + 1; 
    char *buffer = malloc(len_buffer); 
    if (buffer == NULL) { 
    return NULL; 
    } 
    size_t used = 0; 
    for (size_t i = 0; i < len; i++) { 
    if (len_buffer < used || len_buffer - used < 3) { 
     free(buffer); 
     return NULL; 
    } 
    int ret = snprintf(buffer + used, 3, "%.2x", (unsigned char)array[i]); 
    if (ret != 2) { 
     free(buffer); 
     return NULL; 
    } 
    used += 2; 
    } 
    return buffer; 
} 

int main(void) { 
    char const param[] = "ABCDEFGHTUIKLL"; 
    printf("%s\n", param); 
    char *ret = convert_to_16(param, sizeof param - 1); 
    if (ret != NULL) { 
    printf("%s\n", ret); 
    } 
    free(ret); 
} 
+0

ありがとうございました!あなたのCコードは私に非常に専門的な方法を示しています!私は最終的に、このバグを修正する方法を見つけました。これは、私のctypes設定に起因しています。また、c_char_pをc_convert_to_16.argtypesに設定しても問題ありません。 – Castor

関連する問題