数据压缩(DataCompression) 是计算机工程的主要研究内容,经过数十年发展已经有了深入研究,今后还会不断出现更多、更好的算法。
不论哪种形态的文件(数据)都是由二进制(0或1)组成的,只要使用合适的压缩算法,就能缩减其大小。经过压缩的文件若能100%恢复,则称该压缩为“无损压缩”(LosslessDataCompression);若不能恢复原状,则称该压缩为“有损压缩”(LossData Compression)。
无损压缩用来缩减文件(数据)的大小,压缩后的文件更易保管、移动。使用经过压缩的文件之前,需要先对文件解压缩(此过程中应该保证数据完整性)。各位肯定用过类似7-zip、“面包房”的压缩程序,用它们压缩文件就是无损压缩算法。
最具代表性的无损压缩算法有Run-Length、Lempel-Ziv、Huffman等。此外还有许多其他压缩算法,它们都是在上面3种压缩算法的基础上改造而成的。只要准确理解了上面3种,就能轻松掌握其他各种压缩算法。ZIP、RAR等是具有代表性的压缩文件格式,它们最根本的压缩理念也是Run-Length、Lempel-Ziv、Huffman,然后应用了一些各自特有的技术(压缩率、压缩/解压时间)。
相反,有损压缩允许压缩文件(数据)时损失一定信息,以此换取高压缩率。压缩多媒体文件(jpg、mp3、mp4)时,大部分都使用这种有损压缩方式。从压缩特性来看,有损压缩的数据解压缩后不能完全恢复原始数据。人类的肉眼与听觉几乎无法察觉到这些多媒体文件在压缩中损失的数据。 经过有损压缩后,虽然压缩文件与原文件(从数据层面上看)存在差异,但重要的是人们几乎区分不出这种微小的差别。以mp3文件为例,mp3的核心算法通过删除超越人类听觉范围(20~20000Hz)的波长区段来缩减(不需要的)数据大小。
顾名思义,运行时压缩器是针对可执行(PE,PortableExecutable)文件而言的,可执行文件内部含有解压缩代码,文件在运行瞬间于内存中解压缩后执行。运行时压缩文件也是PE文件,内部含有原PE文件与解码程序。在程序的EP代码中执行解码程序,同时在内存中解压缩后执行。表14-1列出了运行时压缩与普通ZIP压缩的不同点。
项目 | 普通压缩 | 运行时压缩 |
---|---|---|
对象文件 | 所有文件 | PE文件 (exe, dll, sys) |
压缩结果 | 压缩文件 (zip, rar) | PE文件 (exe, dll, sys) |
解压缩方式 | 使用专门解压缩程序 | 内部含有解码程序 |
文件是否可执行 | 本身不可执行 | 本身可执行 |
优点 | 可以对所有文件以高压缩率压缩 | 无须专门解压程序便可直接运行 |
缺点 | 若无专门解压缩软件则无法使用压缩文件 | 每次运行均需调用解码程序导致运行时间过长 |
与普通压缩器相比,运行时压缩器的一个明显不同是“PE文件的可运行性”。
PE压缩器是指可执行文件的压缩器,准确一点应该是“运行时压缩器”,他是PE文件的专用压缩器
运行时压缩的概念早在DOS时代就出现了,可当时并未广泛使用。因为那时的PC速度不怎么快,每次执行文件时,解压缩的过程会引起很大的系统开销。而现在的PC速度已经变得非常快,用户不能明显察觉运行时压缩文件与源文件在执行时间上的差别。因此,现在的实用程序、“打补丁”文件、普通程序等都广泛应用运行时压缩。