提起压缩,大家都会想到WINZIP或者RAR之类的压缩软件,实际上,电脑压缩技术的内涵和应用绝不止于此。我们能够在在电脑上欣赏到精美的电影和悦耳的歌曲,压缩技术立下了汗马功劳。在今天互联网的传送速度远不能满足我们需要的时候,网络压缩技术也显得特别重要。正是有了它,我们才得以实现网络视频/音频的即时传送。压缩技术,在不知不觉中改变着我们的生活。
【预备知识】二进制与ASCII编码
电脑里基本的存储单位是字节。ASCII码是一种以字节为单位对常用符号进行编码的方案,因其合理性而较为流行。因为一个字节有8位,所以ASCII最多可对2^8=256个字符进行编码,其中前128个称为标准ASCII码(二进制编号00000000-01111111),后128个称为扩展ASCII码(二进制编号10000000-11111111),电脑里的汉字就是利用两个扩展ASCII码的组合来实现的(GB2312汉字编码方案)。比如汉字“王”占用的两个ASCII编码分别是205和245,十六进制表示是CD和F5,化为二进制就是11001101和11110101。也就是说,在电脑处理“王”这个汉字时,电脑里的信息是“1100110111110101”这样一串数字。再如大写的英文字母“A”的ASCII编码是65,十六进制表示是41,在电脑里的信息实际上是“01000001”。
【缩位压缩】
知道了上述原理后,我们来介绍“缩位压缩”的原理。“缩位”,就是缩减编码里没有必要使用的“位”。例如文件里一个汉字也没有,也就是说内容中没有使用扩展ASCII码,这样所有字符编码的第七位(最前面那一位)将都会是0。利用这一点我们就可以缩掉这一位,假设文件内容是ABCDEFGH。
文件内容: ABCDEFGH
二进制内容:01000001 01000010 01000011 01000100 01000101 01000110 01000111 01001000
压缩后文件内容: [该内容中文状态下显示是乱码,故无法写出]
二进制内容:10000011 00001010 00011100 01001000 10110001 10100011 11001000
这个压缩过程就是将原来顶头的0全部去掉后每8位重排,这样原来占用8个字节的文件就只占用了7个字节。只要解压时再加上第七位的0,文件就可以恢复原样。这一压缩技术特别适用于对数字的压缩。因为0~9这十个阿拉件数字占用的ASCII编码是从00110000-00111001,其前四位全部都是“0011”。
【直接压缩】
直接压缩的原理最易理解,因为有些时候,文件里不可避免地存在着连续同样的字符,比如在文件末尾加了一行“※※※※※※※※※※※※※※※※※※※※※※”符号。这样的话,压缩时可以只记住这个符号以及重复的次数,就可以迅速还原。
【字典压缩】
字典压缩是最重要的一种压缩技术,也是应用最为广泛的一种压缩技术。该技术搜索文件中重复出现的字符串,如“中华人民共和国”、“改革开放”等,记录后(记录后的内容被称为“字典”)在正文中使用另一个简短的编码来代替它。想一想Windows系统里充满了多少的“Windows”和“Microsoft”这些字符,你就会明白为什么这种压缩技术对Windows操作系统如此有效了。这种压缩方案对政治稿件和学术论文特别适用。
字典压缩技术无论对文本文件还是可执行的代码文件都同样高效,而且可以涵盖掉“直接压缩”技术。现在流行的ZIP,ARJ、RAR,AIN等压缩软件都采用了此项技术。但是此种技术中,合适的字典长度很重要,将字典设得太大或太小都严重影响压缩效果,且进行压缩时速度相对较慢。
多数压缩软件综合使用各项压缩技术。
【矢量压缩】
虽然字典压缩强劲有力,但是对有些文件内容还是无能为力,比如下面的内容:
啊雹玻长触郸锭法
这些看起来不成文的汉字实际上却有着内在的联系,它们分别是GB2312编码中的第1601、1702、1803、1904、2005、2106、2207、2308区位的汉字。对于这种情况,可以通过寻找它们之间的数学联系(如数列、方程等)进行记忆式的压缩。这种记忆式的压缩叫做矢量压缩,是一种正在兴起的新压缩技术。
矢量压缩有时可以带给我们意想不到的享受。很多人惊奇于FLASH能以如此小的体积带给我们如此丰富的信息,就是因为FLASH里使用了矢量压缩技术。使用方程记忆一个点的运动轨迹远比记忆这个点的所有位置信息量要小得多的多。但另一面,对于照片和录音这些资料,现在的矢量化技术还做不到从中找到即高保真又有规律的方案来,所以下一种压缩技术有了大显身手的空间。
【有损压缩与VCD】
VCD的产生要归功于联合图象专家组(JPEG)的努力。他们提出了一种全新的压缩技术标准,也可以说是一种全新的压缩概念。这种概念催化了运动图象专家组(MPEG)标准的诞生及VCD工业化的实现。JPEG图象压缩技术以图象的每8*8个点的点阵做为一个处理单元,在这个范围内,如果全部都是某一色彩而只有极个别的其他色彩,那么其他色彩将被忽略。这种压缩技术理论上的压缩比高达为64:1,一个64MB的文件现在只需1MB就可以了?这实在很令人心动。为了进一步扩展压缩效果和提高该技术的适应范围,JPEG做了灵活调整。允许用户自行设置处理单元的大小和忽略其他色彩的程度,这也就是为什么JPEG图像有“质量”属性的原因。
JPEG提出的这种“有损压缩”的概念使得该压缩技术有一定的局限性,比如说,JPEG不适合用来压缩工程图纸、医学影像等等资料。但其注重实用性的思路却大大启发了人们,RealPlayer就是沿着这条路率先实现了网上视频的实时播放。而VCD中剥离了图象的声音则也渐渐形成了流行的MP3音乐。(声音压缩的编码方案过于繁杂,本文未予论述)
【压缩文件缝隙】
除这些压缩技术之外,DOS/Windows系统本身也留给了大家一个压缩的故事。在DOS/Windows系统下,磁盘存储空间被划分成一小块一小块地使用,而不是象UNIX或者Novell那样在系统控制下所有文件都搅和在一起。这种开放式的磁盘文件使用格式虽然不安全(简直毫无安全可言),但是效率高,易操作。这可能也是DOS/Windows在家用和商用市场打败UNIX和Novell但在服务器领域却始终比不上他们的一个重要原因。——因为每个分配块只能供一个文件使用,所以即使文件(或文件的最后一块)只有一个字节,也必须占用一个分配块。因为当时只留了两个字节来分配这种存储块(两个字节是16位,这种分配机制叫做FAT16),所以不论分区有多么大,最多都只能被分为2^16=65536个分配块。比如说一个2GB的分区,其分配块大小是32KB;当分区超过2GB时,分配块将不得不增长到64KB。想一想,如果一个字节的文件也要占掉你的64KB时,你能够不恼火?所以从Windows 95 OSR2版本开始,Microsoft推出了FAT32解决方案。但是即使如此,“文件缝隙”依然存在。
Microsoft为了解决文件缝隙,曾在DOS 6.0时代推出过Double Space(DBLSPACE),后来改为DRVSPACE,这东西在Windows 95/98/ME上还依然存在。当时号称可以倍增硬盘容量,令大家激动不已,但是尝试过后高呼上当。原来Microsoft只不过是抄袭他人,使用了“虚拟卷”技术而已,该技术顶多可以省掉文件缝隙,对于整盘只放了一个大文件的用户来说简直毫无用途。
压缩文件缝隙现在有了一个较好的办法,那就是把不常用的文件用WINZIP打成一个包,尤其是大量的小文件和/或在FAT16的环境下,使用这一方法可以节省你很多的磁盘空间。但是无论如何,“文件缝隙”看来要在Windows系统中永远存在了。
【可能会越压越大】
文件会越压越大么?答案是:会的。因为压缩文件需要一个控制解压缩的文件头(文件格式及字典等),所以对已经“无以为压”的文件进行压缩时,将徒增一个文件头,文件当然会越来越大。另外,虽然压缩后的文件更省空间,更安全了(压缩文件可以加密而普通文本文件不行),但是如果一旦文件头损坏,整个文件将无法解压。所以压缩文件的文件头是很重要的。这跟刚才讲过的FAT格式与UNIX/Novell卷格式的差别比起来,倒是有相形之处。但如果大家的ZIP文件损坏,建议试一下DOS版的ZIP解压程序PKUNZIP,也许还可以解救一部分。
【可执行文件的压缩】
不但文档文件和数据文件可以压缩,可执行文件也可以进行压缩。致力于压缩技术的PKWARE Inc.公司在最早推出PKZIP软件时(大约是1990年的事情),就有三个主要程序,分别是PKZIP.EXE(压缩时用)、PKUNZIP.EXE(解压缩时用)和PKLITE.EXE(压缩可执行文件时用)。压缩可执行文件的过程很神奇,文件名并不会被改变,只是长度会变小。这样的压缩文件在执行时,会在内存中自我释放,然后重定位重加载再执行。因为电脑做起来是一瞬间的事情,所以几乎感觉不到文件被压缩过。在软盘盛行的时代,这个工具十分有用。
Windows下的程序现在是越来越大了,所以很多编程人都将自己的主程序进行压缩,一方面也可以起到防盗版的作用,著名的“Red Alert”就采取了这样的做法。随着互联网传播软件功能的发挥,很多软件被打包为可执行程序,点击后可以自行展开并进行安装,这些也都是可执行文件的压缩的例子。
【压缩技术的辨证分析】
站在历史的观点上分析,压缩技术是必然要灭亡的。我们现在看10前年的DOS时代,当时为了存储目的而实施的压缩工作现在已经淹没在海量的存储设备容量里。从理论上讲,压缩毕竟浪费了我们的时间与精力,如果存储空间足够,我们没有需要压缩的理由。考察现在的压缩目的,除了小部分是为了方便检索之外,目前大量的压缩是为了适应互联网慢吞吞的传送速度。那么,当网速能够满足我们随时将整个硬盘上的内容在网络上拖来拖去时,我们还需要压缩吗?当光盘的容量足够大时,我们还会容忍JPEG技术替我们扔掉那一两个色点吗?
但是哲学指导我们,事情总是在发展,总是有其另一面的特性,当容量不再成为压缩的目的时,传送成了我们压缩的另一个目的。又有谁能够预料,下一个压缩的目的会不会产生,而又将是什么呢?
我们使用计算机所做的事情大多都是对文件进行处理。每个文件都会占用一定的磁盘空间,我们希望一些文件,尤其是暂时不用但又比较重要不能删除的文件(如备份文件,有点像鸡肋呀),尽可能少的占用磁盘空间。但是,许多文件的存储格式是比较松散的,这样就浪费了一些宝贵的计算机存储资源。这时,我们可以借助压缩工具解决这个问题,通过对原来的文件进行压缩处理,使之用更少的磁盘空间保存起来,当需要使用时再进行解压缩操作,这样就大大节省了磁盘空间。当你要拷贝许多小文件时,通过压缩处理可以提高执行效率。如果小文件很多,操作系统要执行频繁的文件定位操作,需要花费很多的时间。如果先把这些小文件压缩,变成一个压缩文件后,再拷贝时就很方便了。由于计算机处理的信息是以二进制数的形式表示的,因此压缩软件就是把二进制信息中相同的字符串以特殊字符标记来达到压缩的目的。为了有助于理解文件压缩,请您在脑海里想象一幅蓝天白云的图片。对于成千上万单调重复的蓝色像点而言,与其一个一个定义“蓝、蓝、蓝……”长长的一串颜色,还不如告诉电脑:“从这个位置开始存储1117个蓝色像点”来得简洁,而且还能大大节约存储空间。这是一个非常简单的图像压缩的例子。其实,所有的计算机文件归根结底都是以“1”和“0”的形式存储的,和蓝色像点一样,只要通过合理的数学计算公式,文件的体积都能够被大大压缩以达到“数据无损稠密”的效果。总的来说,压缩可以分为有损和无损压缩两种。如果丢失个别的数据不会造成太大的影响,这时忽略它们是个好主意,这就是有损压缩。有损压缩广泛应用于动画、声音和图像文件中,典型的代表就是影碟文件格式mpeg、音乐文件格式mp3和图像文件格式jpg。但是更多情况下压缩数据必须准确无误,人们便设计出了无损压缩格式,比如常见的zip、rar等。压缩软件(compression software)自然就是利用压缩原理压缩数据的工具,压缩后所生成的文件称为压缩包(archive),体积只有原来的几分之一甚至更小。当然,压缩包已经是另一种文件格式了,如果你想使用其中的数据,首先得用压缩软件把数据还原,这个过程称作解压缩。常见的压缩软件有winzip、winrar等。
MP3的全称是Moving Picture Experts Group Audio Layer III。简单的说,MP3就是一种音频压缩技术,由于这种压缩方式的全称叫MPEG Audio Layer3,所以人们把它简称为MP3。MP3是利用 MPEG Audio Layer 3 的技术,将音乐以1:10 甚至 1:12 的压缩率,压缩成容量较小的文件,换句话说,能够在音质丢失很小的情况下把文件压缩到更小的程度。而且还非常好的保持了原来的音质。正是因为MP3体积小,音质高的特点使得MP3格式几乎成为网上音乐的代名词。每分钟音乐的MP3格式只有1MB左右大小,这样每首歌的大小只有3-4兆字节。使用MP3播放器对MP3文件进行实时的解压缩(解码),这样,高品质的MP3音乐就播放出来了。
手机、MP3随身听、MP3音乐光盘等等里面存的都是MP3格式的音乐文件,MP3格式相对WAV文件非常小,基本上是1M左右的文件播放时间是1分钟,而且音质还不错。( 兆(M):计算机中数据存储单位 1M=1024KB)。
MP3特点: MP3能保证在音质丢失很小的情况下把文件压缩到最小的程度,并较好的保持了原来的音质。正是因为MP3体积小,音质高的特点使得MP3格式几乎成为网上音乐的代名词。每分钟音乐的MP3格式只有1MB左右大小,这样每首歌的大小只有3到5M 左右
压缩文件的基本原理是查找文件内的重复字节,并建立一个相同字节的“词典”文件,并用一个代码表示,比如在文件里有几处有一个相同的词"中华人民共和国"用一个代码表示并写入"词典"文件,这样就可以达到缩小文件的目的.
由于计算机处理的信息是以二进制数的形式表示的,因此压缩软件就是把二进制信息中相同的字符串以特殊字符标记来达到压缩的目的。为了有助于理解文件压缩,请您在脑海里想象一幅蓝天白云的图片。对于成千上万单调重复的蓝色像点而言,与其一个一个定义“蓝、蓝、蓝……”长长的一串颜色,还不如告诉电脑:“从这个位置开始存储1117个蓝色像点”来得简洁,而且还能大大节约存储空间。这是一个非常简单的图像压缩的例子。其实,所有的计算机文件归根结底都是以“1”和“0”的形式存储的,和蓝色像点一样,只要通过合理的数学计算公式,文件的体积都能够被大大压缩以达到“数据无损稠密”的效果。总的来说,压缩可以分为有损和无损压缩两种。如果丢失个别的数据不会造成太大的影响,这时忽略它们是个好主意,这就是有损压缩。有损压缩广泛应用于动画、声音和图像文件中,典型的代表就是影碟文件格式mpeg、音乐文件格式mp3和图像文件格式jpg。但是更多情况下压缩数据必须准确无误,人们便设计出了无损压缩格式,比如常见的zip、rar等。压缩软件(compression software)自然就是利用压缩原理压缩数据的工具,压缩后所生成的文件称为压缩包(archive),体积只有原来的几分之一甚至更小。当然,压缩包已经是另一种文件格式了,如果你想使用其中的数据,首先得用压缩软件把数据还原,这个过程称作解压缩。常见的压缩软件有winzip、winrar等。
有两种形式的重复存在于计算机数据中,zip就是对这两种重复进行了压缩。
一种是短语形式的重复,即三个字节以上的重复,对于这种重复,zip用两个数字:1.重复位置距当前压缩位置的距离;2.重复的长度,来表示这个重复,假设这两个数字各占一个字节,于是数据便得到了压缩,这很容易理解。
一个字节有 0 - 255 共 256 种可能的取值,三个字节有 256 * 256 * 256 共一千六百多万种可能的情况,更长的短语取值的可能情况以指数方式增长,出现重复的概率似乎极低,实则不然,各种类型的数据都有出现重复的倾向,一篇论文中,为数不多的术语倾向于重复出现;一篇小说,人名和地名会重复出现;一张上下渐变的背景图片,水平方向上的像素会重复出现;程序的源文件中,语法关键字会重复出现(我们写程序时,多少次前后copy、paste?),以几十 K 为单位的非压缩格式的数据中,倾向于大量出现短语式的重复。经过上面提到的方式进行压缩后,短语式重复的倾向被完全破坏,所以在压缩的结果上进行第二次短语式压缩一般是没有效果的。
第二种重复为单字节的重复,一个字节只有256种可能的取值,所以这种重复是必然的。其中,某些字节出现次数可能较多,另一些则较少,在统计上有分布不均匀的倾向,这是容易理解的,比如一个 ASCII 文本文件中,某些符号可能很少用到,而字母和数字则使用较多,各字母的使用频率也是不一样的,据说字母 e 的使用概率最高;许多图片呈现深色调或浅色调,深色(或浅色)的像素使用较多(这里顺便提一下:png 图片格式是一种无损压缩,其核心算法就是 zip 算法,它和 zip 格式的文件的主要区别在于:作为一种图片格式,它在文件头处存放了图片的大小、使用的颜色数等信息);上面提到的短语式压缩的结果也有这种倾向:重复倾向于出现在离当前压缩位置较近的地方,重复长度倾向于比较短(20字节以内)。这样,就有了压缩的可能:给 256 种字节取值重新编码,使出现较多的字节使用较短的编码,出现较少的字节使用较长的编码,这样一来,变短的字节相对于变长的字节更多,文件的总长度就会减少,并且,字节使用比例越不均匀,压缩比例就越大。
压缩原理——最优二叉编码树
实际的文件中,一个字节有256种可能的取值,所以二叉树的叶子节点多达256个,需要不断的调整树形,最终的树形可能非常复杂,有一种非常精巧的算法可以快速地建起一棵最优二叉树,这种算法由D.Huffman(戴·霍夫曼)提出,下面我们先来介绍霍夫曼算法的步骤,然后再来证明通过这么简单的步骤得出的树形确实是一棵最优二叉树。