尝试压缩数据
1.文件以字节为单位保存
文件是将数据存储在磁盘等存储媒介中的一种形式。程序文件中存储数据的单位是字节。 文件的大小之所以用xxKB、xxMB等来表示,就是因为文件是以字节(B=Byte) 为单位来存储的。文件就是字节数据的集合。用1字节 (=8位)表示的字节数据有256种,用二进制数来表示的话,其范围就是 00000000~11111111。如果文件中存储的数据是文字, 那么该文件就是文本文件。如果是图形,那么该文件就是图像文件。在任何情况下, 文件中的字节数据都是连续存储的,大家一定要认识到这 一点。
2.压缩技巧实际上有很多种。接下来, 我们就来看一下本章要介绍的第二个压缩技巧,即哈夫曼算法。 哈夫曼算法是哈夫曼于1952年提出来的压缩算法。 日本人比较常用的压缩软件LHA",使用的就是哈夫曼算法。为了更好地理解哈夫曼算法,首先大家要抛弃掉 “半角英文数字的1个字符是1个字节(8位)的数据”这一概念。 文本文件是由不同类型的字符组合而成的, 而且不同的字符出现的次数也是不同的。例如,在某一个文本文件中,A出现了100次左右, Q仅用到了3次,类似这样的情况是很常见的。 而哈夫曼算法的关键就在于“多次出现的数据用小于8位的字节数来表示, 不常用的数据则可以用超过8位的字节数来表示”。A和Q都用8位来表示时, 原文件的大小就是100次x8位+3次x8位=824位, 而假设A用2位、Q用10位来表示,压缩后的大小就是100次x2位+3次 x10位=230位。不过有一点需要注意,不管是不满8位的数据, 还是超过8位的数据,最终都要以8位为单位保存到文件中。 这是因为磁盘是以字节(8位)为单位来保存数据的(图6-3)。 为了实现这一处理,压缩程序的内容会复杂很多,不过作为回报, 最终得到的压缩率也是相当高的。
3.可逆压缩与非可逆压缩
图像文件还可以使用与前文介绍的RLE算法 、哈夫曼算法不同的其他压缩算法。这是因为,多数情况下, 并不要求压缩后的图像文件必须还原到与压缩前同等的质量。与之相比, 程序的EXE文件以及每个字符、 数值都有具体含义的文本文件则必须要还原到和压缩前同样的内容。而对于图像文件来说, 即使有时无法还原到压缩前那样鲜明的图像状态,但只要肉眼看不出什么区别, 有一些模糊也勉强可以接受。这里,我们把能还原到压缩前状态的压缩称为可逆压缩,无法还原到压缩前状态的压缩称为非可逆压缩。