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

How to decompress less than original size with Lz4 library?

我正在使用 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 次压缩函数调用进行了压缩。

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

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

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

"as soon as" 并不意味着 "exactly at 10"。可能会晚很多,在最坏的情况下,可能会在解码整个块之后。那是因为内部解码引擎仍然是相同的:它解码整个序列,并且出于速度考虑,中间不 "break them"。

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

这似乎已经在lz4 1.8.3中实现了。