HTTP 申请头 Accept-Encoding 会将客户端可能了解的内容编码方式——通常是某种压缩算法——进行告诉(给服务端)。通过内容协商的形式,服务端会抉择一个客户端提议的形式,应用并在响应头 Content-Encoding 中告诉客户端该抉择。
明天咱们就来看一看最常见的 gzip 压缩形式
压缩原理
gzip 应用 deflate 算法进行压缩。具体就是将要压缩的文件先应用 LZ77 算法的一个变种进行压缩,对失去的后果再应用 Huffman 编码的办法进行压缩。
首先介绍下 LZ77 算法,如果文件中有两块雷同的内容,那么只有晓得前一块的地位和大小,咱们就能够确定后一块的内容。所以咱们能够利用两者之间的间隔,内容的长度来替换后一块的内容,文件也就因而失去了压缩。反复内容越多,压缩率也越高。
压缩时,从文件的开始到文件的完结,一个字节一个字节的向后开始解决。用以后解决字节开始的串,和滑动窗口中的每个串进行匹配,寻找最长的匹配串。如果以后解决字节开始的串在窗口中有匹配串,就先输入一个标记位,表明上面是匹配对,并输入该匹配对,而后从方才解决完的串之后的下一个字节急需处理。如果以后解决字节开始的串在窗口中没有匹配串,就先输入一个标记位,表明上面是一个没有改变的字节,而后不做改变地输入以后解决字节,之后持续解决以后解决字节的下一个字节。
解压缩时,从文件开始到文件完结,每次先读一个标记位,通过这个标记位来判断上面的匹配对。如果是一个队,就独处固定位数的对,而后将匹配串输入到以后地位。如果是一个没有改变的字节,就输入该字节即可。
相比压缩而言,解压缩工夫耗费较少。
Huffman 编码应用 Huffman 树来产生编码
要进行 Huffman 编码,首先要把整个文件读一遍,在读的过程中,统计每个符号(咱们把字节的 256 种值看作是 256 种符号)的呈现次数。而后依据符号的呈现次数,建设 Huffman 树,通过 Huffman 树失去每个符号的新的编码。对于文件中呈现次数较多的符号,它的 Huffman 编码的位数比拟少。对于文件中呈现次数较少的符号,它的 Huffman 编码的位数比拟多。而后把文件中的每个字节替换成他们新的编码。
建设 Huffman 树:
把所有符号看成是一个结点,并且该结点的值为它的呈现次数。进一步把这些结点看成是只有一个结点的树。
每次从所有树中找出值最小的两个树,为这两个树建设一个父结点,而后这两个树和它们的父结点组成一个新的树,这个新的树的值为它的两个子树的值的和。如此往返,直到最初所有的树变成了一棵树。咱们就失去了一棵 Huffman 树。
通过 Huffman 树失去 Huffman 编码:
这棵 Huffman 树,是一棵二叉树,它的所有叶子结点就是所有的符号,它的两头结点是在产生 Huffman 树的过程中一直建设的。
咱们在 Huffman 树的所有父结点到它的左子结点的门路上标上 0,右子结点的门路上标上 1。
当初咱们从根节点开始,到所有叶子结点的门路,就是一个 0 和 1 的序列。咱们用根结点到一个叶子结点门路上的 0 和 1 的序列,作为这个叶子结点的 Huffman 编码。
总结:
压缩:
读文件,统计每个符号的呈现次数。依据每个符号的呈现次数,建设 Huffman 树,失去每个符号的 Huffman 编码。将每个符号的呈现次数的信息保留在压缩文件中,将文件中的每个符号替换成它的 Huffman 编码,并输入。
解压缩:
失去保留在压缩文件中的,每个符号的呈现次数的信息。依据每个符号的呈现次数,建设 Huffman 树,失去每个符号的 Huffman 编码。将压缩文件中的每个 Huffman 编码替换成它对应的符号,并输入。