惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
M
MIT News - Artificial intelligence
D
Docker
量子位
T
Tailwind CSS Blog
人人都是产品经理
人人都是产品经理
月光博客
月光博客
有赞技术团队
有赞技术团队
J
Java Code Geeks
A
About on SuperTechFans
P
Proofpoint News Feed
Jina AI
Jina AI
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
V
V2EX
GbyAI
GbyAI
F
Fortinet All Blogs

博客园 - JohnsonFeng

JavaScript 性能优化 --By Google V8 Team Manager 在C++中嵌入JavaScript——Google V8 JavaScript Engine使用体验 介绍相似图片搜索:TinEye VC环境OpenSSL编译笔记 Nginx Server 加密库相关资源 C++中使用Expat解析XML 在C++应用中通过Luabind使用lua脚本(一) - JohnsonFeng - 博客园 在动作捕捉系统中使用加速度和倾角传感器 游戏需求分析 慎用CMFCToolBar::CreateEx [Foward]Reduce Exe File Size IOCP在网络应用中常见错误分析 Direct3D程序调试利器 PIX Win 简介 编写和调试Shader程序(1) 生成均匀“随机数”,一种生成均匀分布数字的简单方法 Visual C++ Profile的简单使用方法 C++简单的函数计时方法 [转]About SIGGRAPH
数据自解压简单原理
JohnsonFeng · 2009-04-06 · via 博客园 - JohnsonFeng

数据自解压简单原理

JohnsonFeng

    自解压文件,就是能将自身的数据解压缩的压缩文件,实际上,这些文件是以exe的形式出现的,这样它才能被执行。简单研究了一下基本步骤,实际并不复杂。

    自解压文件的原理是把压缩数据存放到exe中,当需要解压时,直接执行exe文件,就能把文件解压到制定的位置。那么如何将数据放到exe中是一个首先需要解决的问题,需要解决的第二个问题是exe文件如何实现自解压。

1.将数据集成到exe文件中

    exe文件是PE文件(Portable Execute,包括exe,dll,ocx,sys,com等二进制可执行文件)的一种,如果需要详细知道一个exe文件如何构成,可以查询PE文档格式的相关手册,但本文涉及的问题无需深入研究。大多数C++程序员应该可以联想到将压缩数据作为资源放到exe中,其原理和在exe中放一张位图是一样的,但这有些不便之处,如果需要经常制作这类exe,将不得不安装开发环境,重新编译,而实际上需要做的只不过是修改一下资源。因此,用编译的方法生成最终的exe是不方便的(但完成解压缩部分的自解压程序需要用编译器编译一次)。这里可使用以下函数:

  UpdateResource

  如何使用资源

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中而且是有很多个版本的。