首页 > 解决方案 > LZ4_decompress_safe 是否需要比原始压缩数据更多的输出缓冲区

问题描述

我正在存储压缩数据,然后检索它并解压缩。作为压缩数据的前 4 个字节,我存储了原始数据的大小,因此我确切知道保存解压缩数据所需的缓冲区大小。现在,当我为缓冲区分配确切的字节数以保存解压缩结果并将该字节数传递给 LZ4_decompress_safe 时,有时它会返回负值,例如:

using length_t = std::uint32_t;

length_t orig_size = 0;
std::memcpy(&orig_size, retr_value, sizeof(orig_size));
*value = std::malloc(orig_size);
int lz4_size = LZ4_decompress_safe((const char *)retr_value + sizeof(orig_size), (char*)*value, retr_size - sizeof(orig_size), orig_size);
printf("Retrieved size=%ld Orig size=%d decompress=%d\n", retr_size, orig_size, lz4_size);

retr_value 是我从存储中检索到的压缩缓冲区,retr_size 是该值的长度。它的前 4 个字节存储原始未压缩数据的长度。查看 printf 调用。对于一些解压尝试,它会输出:

检索大小=1093 原始大小=1856 解压缩=-338

这篇文章建议增加缓冲区大小。我开始增加它,首先是两次——这种失败的比例下降了。然后5次,10次-仍然很少失败。最后增加了50倍,没有失败。这是上面显示的问题缓冲区在将缓冲区大小增加 50 倍后的输出(注意现在解压缩结果与原始未压缩长度匹配):

检索大小=1093 原始大小=1856 解压缩=1856

我受到这段代码的启发来解压缩数据:

见第 42-63 行。请注意,ripple 作者只需分配与原始数据精确大小的缓冲区。我究竟做错了什么?

以防万一,这是我压缩的方式:

const int max_dst_size = LZ4_compressBound(value_size);
length_t orig_size = value_size;
char* compressed_data = (char*)std::malloc(max_dst_size + sizeof(orig_size));
std::memcpy(compressed_data, &orig_size, sizeof(orig_size));
const int compressed_data_size = LZ4_compress_HC((const char*)value, compressed_data + sizeof(orig_size), value_size, max_dst_size, 12);

使用 LZ4_compress_default,结果是一样的。

标签: c++lz4

解决方案


推荐阅读