9

我正在使用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);

如果我无法保存初始数据大小(压缩前),并且我不想对必须分配的缓冲区大小过于悲观,我该怎么办?

4

2 回答 2

9

仅供参考,n字节的 LZ4 压缩数据最多可以表示 24 + 255( n - 10) 个未压缩字节,这是运行那么多字节的情况。 n必须至少为 10 才能生成一个有效的流,该流包含一个文字、一个匹配项,然后根据规范在末尾包含五个文字。所以解压缩绑定函数可能类似于(n << 8) - n - 2526.

最大压缩比为: 255 - 2526 / n ,对于任意大的n,它渐近接近 255 。

于 2014-09-10T00:56:16.277 回答
8

LZ4 的最大压缩比为 255,因此保证高估的解压缩数据大小是输入大小的 255 倍。

这显然太多了,无法真正有用,因此没有可用的“反向 LZ4_compressBound()”函数的原因。

恐怕除了保存或知道未压缩的大小之外别无他法。LZ4“原始”压缩格式没有定义保存此类信息的方法,因为最佳选择是特定于应用程序的。例如,某些应用程序事先知道没有块可以> 16KB,因此他们可以在调用LZ4_decompress_safe() 时使用maxDecompressedSize = 16 KB。

现在,如果您正在寻找一种能够承担此类责任的信封格式,您可以创建自己的自定义格式,或者使用 LZ4 框架格式: http: //fastcompression.blogspot.fr/2013/04/lz4- streaming-format-final.html(在源包中也以 LZ4_Framing_Format.html 的形式出现)。唉,能够生成和读取这种格式的库目前处于测试阶段(https://github.com/Cyan4973/lz4/tree/frame

于 2014-09-09T19:04:34.853 回答