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

bob*_*eff 9 c compression snappy lz4

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

int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize);
Run Code Online (Sandbox Code Playgroud)

我想估计最大解压缩数据大小.但我找不到反向功能了

int LZ4_compressBound(int isize);
Run Code Online (Sandbox Code Playgroud)

我可以用它来确定解压缩数据的上限,这maxDecompressedSize是解压缩函数的最后一个参数.

其他压缩库(例如snappy)提供了这样的功能.

bool GetUncompressedLength(Source* source, uint32* result);
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ler 9

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

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


Cya*_*yan 7

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)