Python教程

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

本文主要是介绍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 *。

这篇关于python ctypes char* 返回值打印不完整的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!