2014-09-05 81 views
0

我目前正试图了解DEFLATE算法是如何工作的。我知道它是LZ77和霍夫曼编码的组合。我研究了这两种工作方式,但我目前不知道它们在DEFLATE中如何使用或集成。放气算法伪码

是否存在DEFLATE算法的伪代码?我一直在寻找它,但不幸的是,我所看到的只是解释,没有确切的算法/伪代码。

非常感谢您的帮助。

顺便说一句,我已经查这个网站: http://www.zlib.net/feldspar.html http://www.gzip.org/algorithm.txt 我也查了RFC 1951年文档

例如,我有字符串“DEFLATE膨胀” 那怎样使用DEFLATE进行压缩?

回答

1

wikipedia

放气流由一系列的块组成。每个块由一个3位首标之后,该位的含义是:

首先位:最后 - 嵌段 - 串流标记:

1: this is the last block in the stream. 
0: there are more blocks to process after this one. 

的第二和第三位:用于编码方法此块类型:

00: a stored/raw/literal section, between 0 and 65,535 bytes in length. 
01: a static Huffman compressed block, using a pre-agreed Huffman tree. 
10: a compressed block complete with the Huffman table supplied. 
11: reserved, don't use. 

00 - > LZ77
01,10 - >霍夫曼

LZ77的情况下,它被重复字符串编码(距离,长度)。

如果是01霍夫曼,霍夫曼树是预先约定(将被压缩和解压缩硬编码)。

在huffman 10的情况下,以下是重新创建树和压缩数据的信息。

3

“DEFLATE INFLATE”是一个非常短的字符串,因此将使用固定的霍夫曼编码进行编码。所述压缩数据的拆卸给出:

last 
fixed 
literal 'DEFLATE IN 
match 5 8 
end 

这意味着单个固定块是最后的块,字面字节“DEFLATE IN”,和一个字符串匹配的八个字节回五个字节,其拷贝“FLATE ”。

固定的霍夫曼编码对文字字节,匹配长度和距离以及标记块结束的结束码进行编码。文字,长度和结束码都在一个霍夫曼码中。如果长度被解码,那么后面是距离自己的霍夫曼码的距离码。

除了详细解释收缩格式的RFC 1951之外,您还可以查看zlib发行版中的puff.c代码,该代码旨在通过简单,完整,和充分评论的充气机。

您还可以使用产生上述示例的infgen.c来反汇编缩放压缩的结果(例如,使用gzip)以获得更多信息。

您需要先阅读RFC,理解puff.c以及使用infgen.c查看示例,才能了解deflate格式。只有这样你才能开始考虑用压缩器创建放气流的方法。

如果您不了解RFC 1951,那么您可能需要先深入研究Huffman代码和LZ77。