ZIP文件格式是非常常用的一种压缩格式,比如M$新的EXCEL文件格式其实就是一个ZIP压缩文件,压缩文件内部是几个带路径的XML文件。如果我们想解析EXCEL文件的内容就要把压缩文件内的XML文件先解压出来,然后再解析XML文件内的内容。如果我们把EXCEL文件中的内容直接就会非常方便地进行内容解析。
解压缩ZIP文件格式在WINDOWS下还没有找到相应的API调用,如果使用第三方的库(zlib, libarchive)则要下载源代码进行安装,而且第三方的库文件都是针对各种压缩格式的,其内容非常繁杂,使用起来也很不方便。能不能自己来实现ZIP格式的解压缩,以方便程序的编译和移植呢?
答案是显然的。其实ZIP格式和GZIP格式虽然文件头不一样,但压缩数据的格式却是相同的,而GZIP的源代码相对要简单一些,我们弄清了GZIP和ZIP格式的区别后,就很容易把GZIP源代码中解压缩部分提取出来,使用到ZIP文件的解压缩上来。笔者已经把实现的源代码上传到了GITHUB上了,具体实现比较简单,源代码用C语言实现只有几百行,在这里就不再一一赘述了。
https://github.com/vonzorich/unziptomemory
需要说明的是为了代码简练,笔者只保留了dynamic部分的解压缩,而把store和fixed两种压缩格式的压缩函数拿掉了,CRC校验部分的代码也拿掉了,需要的同学请根据GZIP的源代码自行加上。
示例程序是在LINUX下编译测试通过的,如果是在WINDOWS下编译请更换头文件并自行实现memmem函数。