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