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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值