我要存储压缩的数据,然后检索它并解压缩。作为压缩数据的前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
This post建议增加缓冲区大小。我开始增加它,前两次-这样的失败率下降了。然后5次,10次-仍然很少失败。最终增加了50次,没有失败。这是上面显示的有问题的缓冲区在将缓冲区大小增加50倍之后的输出(注意,现在解压缩结果与原始未压缩的长度匹配):
检索到的大小= 1093,原始大小= 1856,解压缩= 1856
这段代码启发我解压缩数据:
See lines 42-63。注意,涟漪作者只是分配原始数据大小精确的缓冲区。我在做什么错了?
以防万一,这是我的压缩方式:
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,结果相同。