文件的压缩再压缩

背景:看到文件压缩gzip,bzip2。脑子一热,想到能不能再次压缩文件?没有百度到,想要的答案,自己费事来try try。

看不懂的知识:https://blog.csdn.net/xuchuangqi/article/details/52939705

gzip 对于要压缩的文件,首先使用LZ77算法的一个变种进行压缩,对得到的结果再使用Huffman编码的方法(实际上gzip根据情况,选择使用静态Huffman编码或者动态Huffman编码,详细内容在实现中说明)进行压缩。所以明白了LZ77算法和Huffman编码的压缩原理,也就明白了gzip的压缩原理。我们来对LZ77算法和Huffman编码做一个简单介绍。
 

LZ77算法的压缩原理:使用滑动窗口寻找匹配串

LZ77从文件的开始处开始,一个字节一个字节的向后进行处理。一个固定大小的窗口(在当前处理字节之前,并且紧挨着当前处理字节),随着处理的字节不断的向后滑动,就象在阳光下,飞机的影子滑过大地一样。对于文件中的每个字节,用当前处理字节开始的串,和窗口中的每个串进行匹配,寻找最长的匹配串。窗口中的每个串指,窗口中每个字节开始的串。如果当前处理字节开始的串在窗口中有匹配串,就用(之间的距离,匹配长度) 这样一对信息,来替换当前串,然后从刚才处理完的串之后的下一个字节,继续处理。如果当前处理字节开始的串在窗口中没有匹配串,就不做改动的输出当前处理字节。

 

Huffman编码使用Huffman树来产生编码:统计每个符号(我们把字节的256种值看作是256种符号)的出现次数。然后根据符号的出现次数,建立Huffman树,通过Huffman树得到每个符号的新的编码。对于文件中出现次数较多的符号,它的Huffman编码的位数比较少。对于文件中出现次数较少的符号,它的Huffman编码的位数比较多。然后把文件中的每个字节替换成他们新的编码。

 

 正文:

压缩再压缩

一、单个文件的压缩再压缩

1、能否两次使用相同的命令进行压缩?

2、能否两次使用不同的命令进行交替压缩?

3、在上面的基础上 ,能否进行n次压缩?

二、目录文件的压缩

4、关心的是,目录中含有压缩文件,先打包目录文件,再压缩,目录内部的压缩文件的情况。

 

try 问题1:能否两次使用相同的命令进行压缩?

思路:在/tmp下建立一个目录testing1,目录中vim一个文件try1,用gzip命令连续最大程度压缩try1两次

《文件的压缩再压缩》

上面说明,可以两次压缩。第一次压缩97.4%,文件大小由545byte变成45byte,文件变小。

                   第二次压缩11.1%,大小从45byte变成74byte,文件总体变大。

它们在图形界面下是这个样子。那压缩两次的文件是不是解压两次,才能变为原文件了?

《文件的压缩再压缩》

《文件的压缩再压缩》 

种什么因故,得什么果。上面显示,压缩两次的文件,需要解压两次才行。

 

同样的方法,我们再试试能否用bzip2命令进行两次压缩。

《文件的压缩再压缩》

这就挺有意思的, bzip2能压缩一次,压缩比为88.99%。但是再次压缩的时候,显示.bz2已经压缩过了。

那这是不是说,这就证明bzip2不能进行两次压缩呢?

好像并不能,咋们要是第一次压缩的时候,压缩出来的文件命名不含有.bzip,它能否接着压缩了?try try。

不急,咋们先进入图形界面中看一看,会发现一些好玩的现象

《文件的压缩再压缩》

这里并不是再次压缩,try.bz2.bz2只是一个空壳子,里面没有东西。咋们验证一下。

《文件的压缩再压缩》

好,咋们把上次的bzip2压缩的文件删除,通过bzip2命令把try压缩成trybz2。再将 trybz2一次压缩文件,用bzip2命令再次压缩。

《文件的压缩再压缩》

上面说明,bzip2也能压缩文件两次。但是有.bz2后缀名的文件,无法用bzip2再次压缩。

 

try问题2:能否两次使用不同的命令进行交替压缩?

《文件的压缩再压缩》

 结果当然也是可以的,即能使用不同的命令进行交替压缩。

那能否用bzi2压缩try.gz.bz2.gz呢?即try.gz.bz2.gz算不算含有.bz2?      答案是:try.gz.bz2.gz不算含有.bz2

《文件的压缩再压缩》

我觉得上面已经够智障的,压缩n的事情就智障透顶了。丫的,花的时间有点多。

 

try问题4:关心的是,目录中含有压缩文件,先打包,再压缩,目录内部的压缩文件情况。

咋们先来猜一猜答案:我猜测,不会压缩打包文件中已经压缩的文件了。

实验是检验真理的标准。

首先是删除不必要的文件

《文件的压缩再压缩》

再打包,压缩

《文件的压缩再压缩》

但是,我也不知道,这包里的压缩文件有没有再次压缩。因为里面压缩和外面的压缩方式不同。

这是一个很有意思也很有价值的问题:目录中含有压缩文件,先打包,再压缩,内部的压缩文件会不会再次被压缩

这个问题留着,现在我解决不了。因为像bzip2那样,能认出自己已经压缩过的文件不奇怪。

但bzip2能不能识别出其他方式压缩出来的文件,并避免再次压缩呢?

这个问题留着,说不定,以后就知道了。(所有的压缩文件在前方有个统一的标注?)

 

    原文作者:大1234草
    原文地址: https://blog.csdn.net/sinat_38816924/article/details/82592652
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞