LZ4库解压缩数据上限大小估算

11

我正在使用LZ4库,但在解压数据时遇到了问题。

int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize);

我想估算最大解压数据大小,但我找不到反向函数。

int LZ4_compressBound(int isize);

我需要确定解压后数据的上限,并将其提供给解压函数的最后一个参数maxDecompressedSize。其他压缩库(例如snappy)也提供了这样的功能。

bool GetUncompressedLength(Source* source, uint32* result);

如果我没有能力保存初始数据大小(压缩之前的大小),而且我不想对我必须分配的缓冲区的大小过于悲观,那我该怎么办?

2个回答

10
仅供参考,n字节的LZ4压缩数据可以表示多达24 + 255(n - 10)个未压缩字节,这是连续这么多字节的情况。 根据规范,n必须至少为十,以生成包括一个文字、一个匹配和最后五个文字的有效流。 因此,解压绑定函数可能类似于(n << 8) - n - 2526
然后,最大压缩比为:255-2526 / n,当n无限大时,渐近地趋近于255。

我从来没有像你在这篇文章中那样精确地计算过界限。感谢你提供的简单公式! - Cyan

8
LZ4的最大压缩比为255,因此保证解压后数据大小是输入大小的255倍。这显然太多了,无法真正发挥作用,因此没有提供“反向LZ4_compressBound()”函数。唯一的方法就是保存或知道未压缩数据的大小。LZ4“原始”压缩格式没有定义保存此类信息的方法,因为最佳选择是应用程序特定的。例如,某些应用程序预先知道没有块可以> 16KB,因此在调用LZ4_decompress_safe()时可以使用maxDecompressedSize = 16 KB。如果你正在寻找一个能够承担这种责任的信封格式,你可以创建自己的自定义格式,或者使用LZ4 Framing格式:http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html(也在源包中作为LZ4_Framing_Format.html)。不幸的是,目前能够生成和读取此格式的库仍处于测试阶段(https://github.com/Cyan4973/lz4/tree/frame)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接