数据自解压简单原理
JohnsonFeng
自解压文件,就是能将自身的数据解压缩的压缩文件,实际上,这些文件是以exe的形式出现的,这样它才能被执行。简单研究了一下基本步骤,实际并不复杂。
自解压文件的原理是把压缩数据存放到exe中,当需要解压时,直接执行exe文件,就能把文件解压到制定的位置。那么如何将数据放到exe中是一个首先需要解决的问题,需要解决的第二个问题是exe文件如何实现自解压。
1.将数据集成到exe文件中
exe文件是PE文件(Portable Execute,包括exe,dll,ocx,sys,com等二进制可执行文件)的一种,如果需要详细知道一个exe文件如何构成,可以查询PE文档格式的相关手册,但本文涉及的问题无需深入研究。大多数C++程序员应该可以联想到将压缩数据作为资源放到exe中,其原理和在exe中放一张位图是一样的,但这有些不便之处,如果需要经常制作这类exe,将不得不安装开发环境,重新编译,而实际上需要做的只不过是修改一下资源。因此,用编译的方法生成最终的exe是不方便的(但完成解压缩部分的自解压程序需要用编译器编译一次)。这里可使用以下函数:
BOOL UpdateResource( HANDLE hUpdate, LPCTSTR lpType, LPCTSTR lpName, WORD wLanguage, LPVOID lpData, DWORD cbData);
在使用它之前,自解压程序中需要先定义一个资源,这个资源可以是任意的,但需要确定好它的ID号,用此函数更新资源,可以把数据填进去。当然,除了上述的自解压程序外,还得制作一个生成自解压包的程序,它利用以上函数将压缩后的数据添加到目标文件。
自解压程序+数据==添加数据到自解压程序中==>自解压文件
2.exe文件如何实现自解压
制作自解压程序的过程,和利用第三方压缩/解压缩库解压一般数据包是类似的,不同的是,压缩数据不再是独立的文件,而是包含在exe中。在解压时,需要调用exe自身的资源,读入内存,并使用相应的解压缩算法解开数据。WinZIP和WinRAR软件生成的自解压程序同样也有一个自解压程序,通常被称为sfx,都是很小的程序,带有解压缩功能。
另外,如果自己使用zlib,可以到官方网站下载,使用起来很容易,一个compress和一个decompress函数,压缩解压全搞定!
本文讨论的关键问题应该已经解决了,至于数据是否需要压缩、以及需要使用几个资源文件可依需求而定。自解压文件可用于安装程序发布,也可用于发布不同版本的程序,如果这些数据需要集成到exe中而且是有很多个版本的。