原理分析
此处压缩编码的原理,就是利用字典,将重复的内容用实时创建的字典来代替,如abab,压缩后得到的是ab[e0](e0代表字典代替,并非实际效果),而abababab,压缩后得到ab[e0][e1](其中e0为ab,而e1为abab),编码端和解码端分别建立字典,最终得到的压缩文件不含字典内容,而为了表示压缩的内容,本例中使用了扩展Ascll码。
示例代码
此处的示例代码单独存放,可以在此查看,不占用本文的大部分空间
实际效果对比分析
此处选择了zip与此例中使用的lzw算法进行对比分析,之所以选择zip,首先zip是目前常用的开源无损压缩算法之一,同时zip是Phil Katz由LZ77算法的思想发展过来最终编码实现的,而LZ77算法的提出者Jacob Ziv和Abraham Lempel后续发布了包括LZW在内的诸多算法,并且查阅资料了解到在GIF算法中有LZW的应用。
回归正题,我们查看实际文件的压缩效果,本例的压缩可能对于zip压缩的唯一优势就是极少的文件头和文件尾,这里只用开头的8字节发送了原文件长如下图00000055即为16进制的55,也就是85字节
而一个zip文件就有更多内容,下面是由一个空的txt文件压缩得到的zip文件
在其中可以看到原文件名(_.txt)和明显的几个PK的标记(纪念zip的创始人Phil Katz),除此之外的部分如下图所示这些内容对于一个实际能够广泛使用的压缩算法来说是必要的,而本例中只能自娱自乐用了,因为没有一个市面上的解码器能识别这个文件的格式。
实际压缩的例子
文件 | 压缩前 | 压缩后 | 压缩方式 |
---|---|---|---|
MP4视频文件 | 76630KB | 94137KB | lzw |
MP4视频文件 | 76630KB | 76648KB | zip |
内容为ababab的txt文件 | 6bit | 12bit | lzw |
内容为ababab的txt文件 | 6bit | 160bit | zip |
MP3音频文件 | 3526kb | 4238kb | lzw |
MP3音频文件 | 3526kb | 3469kb | zip |
FLAC音频文件 | 28963kb | 35500kb | lzw |
FLAC音频文件 | 28963kb | 28968kb | zip |
全是重复的ab的文本文档 | 18578bit | 548bit | lzw |
全是重复的ab的文本文档 | 18578bit | 182bit | zip |
本例中的代码文件 | 5277bit | 3878bit | lzw |
本例中的代码文件 | 5277bit | 1785bit | zip |
完全没有重复的txt文本文档 | 85bit | 170bit | lzw |
实际压缩结果分析
很显然经过此例的压缩得到的结果基本都不能让人感到理想,在面对完全重复,最适合压缩的文件,全是重复的ab文本文档时也没有达到zip的压缩程度,当然这里对比并非要与zip一较高下,这一文件被压缩为:
00 00 48 92 00 61 00 62 01 00 01 02 01 01 01 04 01 03 01 06 01 05 01 08 01 07 01 0A 01 09 01 0C 01