【问题标题】:How can we learn the size of uncompressed data of a bzip2 block?我们如何知道 bzip2 块的未压缩数据的大小?
【发布时间】:2016-04-06 07:27:59
【问题描述】:

bzip2 以块为单位压缩数据,其中每个块以幻数1AY&SY 开头。

我们可以确定每个块后面的未压缩数据的大小吗?

一种方法是解压bzip2文件block-by-block,然后找到每个解压块的大小。 但是我正在尝试找到一种不涉及解压缩的方法,并且我可以在压缩期间了解未压缩块的大小。

它的用例是我们需要告诉解压工具解压块的最大大小是多少,以便它分配足够的内存。解压会在嵌入式平台上完成,资源有限。

块的 bzip2 标头格式也不包含任何关于解压缩块大小的信息。 bzip2 文件格式见维基百科page

注意:我需要 C 代码方面的解决方案,因为我在用 C 开发的控制台应用程序中使用 bzip2,它在 Linux 和 Windows 上都运行。

【问题讨论】:

  • 另见Bzip手册和Utility functions | BZ2_bzBuffToBuffDecompress:"因为无法提前知道压缩数据的压缩比,所以没有简单的方法可以保证输出缓冲区会很大够了。你当然可以在你的代码中安排记录未压缩数据的大小,但是这样的机制超出了这个库的范围……”

标签: c bzip2


【解决方案1】:

块的 bzip2 标头格式也不包含任何信息 关于解压缩块的大小。见维基百科页面 对于 bzip2 文件格式。

以上陈述回答了您自己的问题。你不能,因为它在解压之前不可用。它不会在头中的任何位置压缩之前对块大小进行编码,此处已确认...

http://www.forensicswiki.org/wiki/Bzip2

你必须解压每个块才能知道它的大小。

【讨论】:

  • 也许我们可以更改 bzip2 的源代码以使这些信息可用?如果您知道代码中应该操作的区域?
  • 是的,你可以改变它。您应该获得一个您已经尝试过的示例并将其发布在您的问题中。
  • 我查看了代码但找不到方法,所以问是否有人知道方法。
  • 你准备好分叉 bzip2 了吗?您创建的任何内容都不适用于任何其他需要标准标头的 bzip2。
  • 我不想更改 bzip2 标头,但获取此信息并以其他方式将其发送到解压缩工具。
【解决方案2】:

在初始运行长度编码完成后,只有关于在编码中使用的块大小的信息。因此,正如文章所述,在最坏的情况下,您可能会从一个块中获得 46MB 的解压缩数据,而您所知道的是 RLE 反转之前的输出为 900kB。

因此,实际上,执行此操作的唯一方法是将文件至少解压缩到 RLE 阶段并根据此计算大小。

【讨论】:

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