1

我正在使用 LZ4 库,并且在解压缩数据时使用:

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

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

我想知道我是否可以传递n而不是传递NoriginalSize函数的参数?

我最初的测试表明,这是不可能的(我得到了错误的解压缩数据)。虽然也许有一种方法,例如 ifn是 some 的倍数CHUNK_SIZE?所有原始N字节都通过 1 次调用 compress 函数进行压缩。

4

2 回答 2

4

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

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

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

“尽快”并不意味着“正好在 10 点”。可能要晚得多,在最坏的情况下,可能是在解码整个块之后。那是因为内部解码引擎仍然是相同的:它解码整个序列,并且不会在中间“破坏它们”,以考虑速度。

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

于 2015-11-26T23:14:47.830 回答
1

这似乎已在 lz4 1.8.3 中实现。

于 2018-10-29T13:52:10.627 回答