使用开源库zlib压缩和解压文件

zlib,一个十分强大的开源压缩解压库,应用示范广泛,很多开源库中都有它的存在(libpng,libzplay,ffmpeg……)。

作为普通开发者只要掌握其主要的两个函数就足够用了:

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示

source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen表示 dest 缓冲区的大小,destLen > (sourceLen + 12)*100.1%。

int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen 是

source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。

在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需

要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。

看一个小例子:

/ zlibDemo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "zlib.h"
#include 
#include 
#include 
using std::cout;
using std::endl;
//静态加载如下:
//#pragma comment(lib,"zlib1")
const char* pFileCom="..\\Debug\\save.xml";//源文件
const char* pFileSave="..\\Debug\\1.zip";//压缩后的文件
#define MAX_LEN 1024*100//本例只适用于小于100KB的文件
int _tmain(int argc, _TCHAR* argv[])
{
	//压缩文件
	FILE* fp1=NULL;
	fp1=fopen(pFileCom,"rb");
	assert(fp1);
	//申请缓冲区
	unsigned char* pBufferRes=new unsigned char[MAX_LEN];
	unsigned char* pBufferDes=new unsigned char[MAX_LEN];
	//置零
	memset(pBufferRes,0,MAX_LEN);
	memset(pBufferDes,0,MAX_LEN);
	//读取整个文件到缓冲区
	fread(pBufferRes,sizeof(unsigned char),MAX_LEN-1,fp1);
	uLongf lSize=strlen((const char*)pBufferRes);
	//动态加载DLL
	HINSTANCE hIns=::LoadLibrary(_T("..\\Debug\\zlib1.dll"));
	uLongf desLen;
	if(hIns)
	{
		typedef int (*fun)(Bytef*,uLongf*,const Bytef*,uLongf);
		fun f=NULL;
		//指向函数地址的指针
		f=(fun)GetProcAddress(hIns,"compress");
		if(f==NULL)
		{
			cout<<"获取模块函数地址失败!"<
	//释放申请的内存空间
	delete[] pBufferDes;
	pBufferDes=NULL;
	delete[] pBufferRes;
	pBufferRes=NULL;
	return 0;
}

/*zlib中两个主要函数的声明:
int compress OF((Bytef *dest,   uLongf *destLen,const Bytef *source, uLong sourceLen));
int uncompress OF((Bytef *dest,   uLongf *destLen,const Bytef *source, uLong sourceLen));*/


运行程序,结果如下:

下载地址:

              下载zlibDemo

你可能感兴趣的:(C/C++基础)