unsigned char *xxtea_decrypt(unsigned char *data, xxtea_long data_len, unsigned char *key, xxtea_long key_len, xxtea_long *ret_length);
python 调用ctype获取 xxtea_decrypt函数的返回值的时候,
执行
ret_count_pointer = handle.xxtea_decrypt(data, data_len, keym key_len, ret_len) print(ret_count_pointer.contents.value)
发现数据打印不完全,原来是数据中包含 \0, 但是我们的需求是要打印完整的char*,
也就是从首地址开始, 一直连续打印 ret_length 个字节的数据
那么需要对c层函数进行改造, 即 使用一个指针作为函数的参数,将结果保存在这个指针指向的内存单元中,
但是函数执行完后打印指针的值,还是会遇到 ‘\0’ 这个问题,会提前终止这个字符串。
那么就需要一个神器了。
ret_buffer = create_string_buffer(10000 * 100) # 10M res_len = handle.xxtea_decrypt_wrapper(data_buffer, data_len, key_buffer, key_len, ret_buffer)
使用ctypes的函数 create_string_buffer, 这样再进行打印 buffer的时候,就会打印出 10000*100大小的数据。 但是 buffer 的数据并不都是我们想要的,所以就需要一个参数或者是返回值来记录返回的数据的长度,
print(ret_buffer[:res_len])
这样就取出了完整的 char *。