python ctypes char* 返回值打印不完整

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 *。

上一篇:STM32F103基于W5500实现Modbus简单TCP通信


下一篇:Java NIO Channel 使用