如何使用Lz4库解压缩小于原始大小?

时间:2015-11-25 13:25:24

标签: c++ compression lz4

我正在使用LZ4库并在使用以下内容解压缩数据时

int LZ4_decompress_fast_continue (void* LZ4_streamDecode, const char* source, char* dest, int originalSize);

我只需要原始编码n字节的前N个字节,其中n < N。因此,为了提高性能,仅解压缩原始缓冲区的一部分是有意义的。

我想知道我是否可以将n而不是N传递给函数的originalSize参数?

我的初步测试显示,这是不可能的(我的数据解压缩不正确)。虽然可能有办法,例如n是某个CHUNK_SIZE的倍数?所有原始N字节都是通过1次压缩函数调用来压缩的。

2 个答案:

答案 0 :(得分:3)

LZ4_decompress_safe_continue()LZ4_decompress_fast_continue()只能解码完整的区块。他们将部分块视为错误,并将其报告为错误。他们还认为,如果没有足够的空间来解压缩整个块,那也是一个错误。

您正在寻找的功能尚不存在。但有一个亲密的堂兄可能会有所帮助。

LZ4_decompress_safe_partial()可以解码块的一部分。 请注意,与_continue()变体相比,它仅适用于独立块。 另请注意,压缩块必须完整,并且输出缓冲区必须具有足够的空间来解码整个块。因此,此函数提供的唯一优势是速度:如果您只需要前10个字节,它将在生成足够的字节后立即停止。

&#34;一旦&#34;并不意味着&#34;恰好在10&#34;。它可能要晚得多,在最坏的情况下,它可能是在解码整个块之后。那是因为内部解码引擎仍然是相同的:它解码整个序列,并且没有打破它们。#34;在中间,出于速度考虑。

如果你需要提取少于完整块的字节以节省一些内存,我担心还没有解决方案。将其作为功能请求报告给上游。

答案 1 :(得分:1)

这似乎已在lz4 1.8.3中实现。