【问题标题】:LZ4 library decompressed data upper bound size estimationLZ4库解压数据上限大小估计
【发布时间】:2014-11-02 15:06:50
【问题描述】:

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

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

【问题讨论】:

    标签: c compression snappy lz4


    【解决方案1】:

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

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

    【讨论】:

    • 我从来没有像你在这篇文章中那样清楚地计算出精确的限制。感谢您提供简单的公式!
    【解决方案2】:

    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 的形式出现在源包中)。唉,能够生成和读取这种格式的库目前处于 beta 阶段(https://github.com/Cyan4973/lz4/tree/frame

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多