我们如何了解一个 bzip2 块的未压缩数据大小?

4
bzip2是一种将数据压缩在块中的工具,每个块以一个魔数1AY&SY开始。
我们能否确定每个块后面未压缩数据的大小?
一种方法是逐块解压缩bzip2文件并找到每个解压缩块的大小。但是,我正在寻找一种不涉及解压缩的方法,可以在压缩时了解未压缩块的大小。
这样做的用例是我们需要告诉解压缩工具未压缩块的最大大小,以便它分配足够的内存。解压将在嵌入式平台上进行,因此我们有限的资源。
对于块的bzip2头格式也不包含任何有关未压缩块大小的信息。请参阅维基百科页面了解bzip2文件格式。
注意:我需要使用C代码的解决方案,因为我正在我的C控制台应用程序中使用bzip2,该程序在Linux和Windows上运行。

另请参阅Bzip手册和[实用函数| BZ2_bzBuffToBuffDecompress](http://www.bzip.org/1.0.3/html/util-fns.html):“因为压缩数据的压缩比事先无法知道,所以没有简单的方法可以保证输出缓冲区足够大。当然,您可以在代码中做出安排来记录未压缩数据的大小,但这样的机制超出了此库的范围...” - jww
2个回答

1
块的bzip2头格式也不包含任何关于解压后块大小的信息。请参阅bzip2文件格式的维基百科页面。 上述声明回答了您自己的问题。在解压缩之前,该信息是不可用的。在头中没有编码压缩前的块大小,在此得到证实...

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

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

也许我们可以修改bzip2的源代码,使得这些信息可用。如果你知道应该如何操作其中的代码区域的话。 - Zeeshan
是的,您可以更改它。您应该获取您已尝试执行的示例并将其发布在您的问题中。 - Harry
我研究了代码但是找不到解决方法,所以问有没有人知道解决方案。 - Zeeshan
你准备分叉bzip2了吗?如果你创建的内容与期望标准头的其他bzip2不兼容,将无法正常工作。 - Harry
我不想改变bzip2头,但是要获取这些信息并以其他方式发送给解压工具。 - Zeeshan

0

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

因此,实际上,唯一的方法是至少将文件解压缩到RLE阶段,并基于此计算大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接