【问题标题】:LZO Decompression Buffer SizeLZO 解压缓冲区大小
【发布时间】:2009-04-21 18:30:55
【问题描述】:

我在一个项目中使用 MiniLZO 来完成一些非常简单的压缩任务。我用一个程序压缩,用另一个程序解压。我想知道要为解压缓冲区分配多少空间。我对过度分配空间很好,如果它可以省去我必须用整数注释我的输出文件来声明解压缩数据应该占用多少空间的麻烦。我如何计算它可能占用多少空间?

经过一番思考,我觉得这个问题归结为:lzo1x压缩的最大压缩比是多少?

【问题讨论】:

    标签: c compression lzo


    【解决方案1】:

    由于您同时控制压缩器和解压缩器,我建议您将输入压缩为固定大小的块。在我的应用程序中,我在每个块中最多压缩 64KB,然后发出压缩块的大小和压缩数据本身,因此压缩流实际上看起来像一系列压缩块:

    length_of_block_1
    block_1
    length_of_block_2
    block_2
    ...
    

    解压器只是读取每个压缩块并将其解压到 64KB 缓冲区中,因为我知道该块是通过压缩 64KB 块生成的。

    希望对你有帮助,

    埃里克·梅尔斯基

    【讨论】:

    • 这也是一个很好的建议,但它添加了注释——这正是我希望避免的。因此,我也可以将我的数据压缩在一个块中(因为它已经是这样存储的)并用块大小对其进行注释。
    • 我以为您只是想避免在输出中存储 decompressed 大小。我认为您不能避免存储某种块结束标记,除非您确保输入块始终小于 N 个字节;那么每个压缩流都有一个块,所以你不需要分隔符。或者您可以扩展解压缩器以在填充缓冲区时返回部分结果和“更多工作”代码,因此您可以重复调用它来解压缩整个输入。
    • 所有好的建议,但我认为存储解压缩缓冲区的大小会比这更简单。所以,我想我的问题的答案是“克服它并使用解压缩后的大小进行注释”。
    【解决方案2】:

    解压缩数据的最大大小显然与您首先压缩的数据的最大大小相同。

    如果您的输入大小有上限,那么我想您可以使用它,但我不得不说通常的做法是在您的压缩缓冲区中添加一个标头,以指定未压缩的大小。

    【讨论】:

    • 谢谢,我会记住的。可悲的是,我也无法控制最大尺寸。如果我想安全地执行此操作,我可能必须添加一个标题。
    猜你喜欢
    • 2016-03-13
    • 2021-08-16
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2010-11-02
    • 2017-01-26
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多