我有一个巨大的文件,由字符“0”,“1”,“2”,“3”组成。没有空间,没有别的。这4个字符。我用bzip2压缩它,文件从X减小到0.05 * X.我想知道bzip2找到什么字符串/模式来实现文件的压缩版本(例如0123213232,0123121212222112等)。有没有一种简单的方法可以从实际的bz2文件中提取信息,或者通过运行bzip2和一些特殊的命令行选项来提取信息?
如果您知道其他现有压缩程序的答案,我也有兴趣听到这个。
感谢您的帮助。
最佳, Surikator。
答案 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)
它也称为块排序。如果您不喜欢阅读维基百科,请阅读计算机科学数学基础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"
。像这样的二叉树是建立的:
然后用它来构建编码表:
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
如果您拥有相同的树,则只能读取新二进制文件,因此也会在输出中进行备份。此外,数据的长度也是存储的,因为新二进制数的总和不是完整的字节数。
你可以阅读