如何获取bzip2发现的模式? (或任何其他压缩算法)

时间:2010-11-02 00:45:30

标签: algorithm compression

我有一个巨大的文件,由字符“0”,“1”,“2”,“3”组成。没有空间,没有别的。这4个字符。我用bzip2压缩它,文件从X减小到0.05 * X.我想知道bzip2找到什么字符串/模式来实现文件的压缩版本(例如0123213232,0123121212222112等)。有没有一种简单的方法可以从实际的bz2文件中提取信息,或者通过运行bzip2和一些特殊的命令行选项来提取信息?

如果您知道其他现有压缩程序的答案,我也有兴趣听到这个。

感谢您的帮助。

最佳, Surikator。

3 个答案:

答案 0 :(得分:3)

Bzip2使用Burrows-Wheeler变换以可逆的方式将重复的字节序列转换为相同字节的序列。然后,它使用move-to-front算法将重复的字节转换为零序列。之后,它使用huffmann coding将更短的符号分配给更频繁的字节(可能是零)。您可以在wikipedia page上找到更多详细信息。

答案 1 :(得分:1)

bzip2没有这方面的选项,它不能完全像我认为你认为它的工作。无论如何,您可以找到算法中各个部分的代码。正如@stribika所提到的,它使用Burrows-Wheeler并在通过霍夫曼编码器泵送之前转向前算法。谷歌应该用你选择的语言为你获得Burrow's Wheeler变换的结果。

但是,根据您的需求,我认为您需要更多字典样式编码器。您可能对LZW算法感兴趣:

http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch

它将构建一个像你所展示的字符串字典。

答案 2 :(得分:1)

Burrows-Wheeler变换

它也称为块排序。如果您不喜欢阅读维基百科,请阅读计算机科学数学基础1999:http://books.google.ee/books?id=OcJjpqAi15EC&pg=PA34&lpg=PA34&dq=mathematica+Burrows%E2%80%93Wheeler+transform&source=bl&ots=KaOOIPJcKC&sig=5PzHG9UQeg3opr1FUMq8mPAxfn4&hl=et&ei=Y6vPTLfVFsqCOozvvPcE&sa=X&oi=book_result&ct=result&resnum=1&ved=0CBMQ6AEwAA#v=onepage&q&f=false

霍夫曼编码

输入:"this is an example of a huffman tree"。像这样的二叉树是建立的:

alt text

然后用它来构建编码表:

 Char ' ' nr(32)    | binary:00100000 | new binary:111
 Char 'a' nr(97)    | binary:01100001 | new binary:001
 Char 'e' nr(101)   | binary:01100101 | new binary:000
 Char 'f' nr(102)   | binary:01100110 | new binary:1101
 Char 'h' nr(104)   | binary:01101000 | new binary:1100
 Char 'i' nr(105)   | binary:01101001 | new binary:1001
 Char 'l' nr(108)   | binary:01101100 | new binary:01101
 Char 'm' nr(109)   | binary:01101101 | new binary:1000
 Char 'n' nr(110)   | binary:01101110 | new binary:1011
 Char 'o' nr(111)   | binary:01101111 | new binary:01100
 Char 'p' nr(112)   | binary:01110000 | new binary:01111
 Char 'r' nr(114)   | binary:01110010 | new binary:01110
 Char 's' nr(115)   | binary:01110011 | new binary:1010
 Char 't' nr(116)   | binary:01110100 | new binary:0101
 Char 'u' nr(117)   | binary:01110101 | new binary:01001
 Char 'x' nr(120)   | binary:01111000 | new binary:01000

如果您拥有相同的树,则只能读取新二进制文件,因此也会在输出中进行备份。此外,数据的长度也是存储的,因为新二进制数的总和不是完整的字节数。

打开软件

你可以阅读