Python ctypes无法从.so文件返回长字符串值

我正在学习C并试图通过使用python包ctypes将.so导入到我的python文件中以获得更高的性能。 所以一切顺利,直到我在尝试从.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代码:

 c_convert_to_16 = ctypes.CDLL('./convert_to_16.so').convert_to_16 c_convert_to_16.restype = ctypes.c_char_p a_string = "ABCDEFGHTUIKLL" new_16base_string = c_convert_to_16(a_string, len(a_string)) print new_16base_string 

它运行但只返回两个字符:

41

我阅读了官方文档并将restype设置为ctypes.c_char_p,并尝试将其设置为其他值。 但它似乎是唯一的选择,奇怪的是只返回了两个字符。

这是我的ctypes配置问题还是我的C写得不正确? 非常感谢。

我不太了解python中的ctypes,但你应该像c_char_p("ABCDEFGHTUIKLL")那样创建你的字符串。

也许告诉你的函数c_convert_to_16.argtypes = [c_char_p, c_size_t]什么参数c_convert_to_16.argtypes = [c_char_p, c_size_t]

这将修复C中未定义的行为:

 #include  #include  #include  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); }