我们如何知道 bzip2 块的未压缩数据的大小?
Posted
技术标签:
【中文标题】我们如何知道 bzip2 块的未压缩数据的大小?【英文标题】:How can we learn the size of uncompressed data of a bzip2 block? 【发布时间】: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:"因为无法提前知道压缩数据的压缩比,所以没有简单的方法可以保证输出缓冲区会很大够了。你当然可以在你的代码中安排记录未压缩数据的大小,但是这样的机制超出了这个库的范围……” 【参考方案1】:块的 bzip2 标头格式也不包含任何信息 关于解压缩块的大小。见***页面 对于 bzip2 文件格式。
以上陈述回答了您自己的问题。你不能,因为它在解压之前不可用。它不会在头中的任何位置压缩之前对块大小进行编码,此处已确认...
http://www.forensicswiki.org/wiki/Bzip2
你必须解压每个块才能知道它的大小。
【讨论】:
也许我们可以更改 bzip2 的源代码以使这些信息可用?如果您知道代码中应该操作的区域? 是的,你可以改变它。您应该获得一个您已经尝试过的示例并将其发布在您的问题中。 我查看了代码但找不到方法,所以问是否有人知道方法。 你准备好分叉 bzip2 了吗?您创建的任何内容都不适用于任何其他需要标准标头的 bzip2。 我不想更改 bzip2 标头,但获取此信息并以其他方式将其发送到解压缩工具。【参考方案2】:在初始运行长度编码完成后,只有关于在编码中使用的块大小的信息。因此,正如文章所述,在最坏的情况下,您可能会从一个块中获得 46MB 的解压缩数据,而您所知道的是 RLE 反转之前的输出为 900kB。
因此,实际上,执行此操作的唯一方法是将文件至少解压缩到 RLE 阶段并根据此计算大小。
【讨论】:
以上是关于我们如何知道 bzip2 块的未压缩数据的大小?的主要内容,如果未能解决你的问题,请参考以下文章
sh 获取bzip2未压缩文件大小,重新压缩bzip2存档...等
压缩打包介绍 gzip压缩工具 bzip2压缩工具 xz压缩工具