您的位置:首页 > 其它

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

2018-03-03 09:58 489 查看
http://blog.csdn.net/zhu2695/article/details/51285985

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 是解压出来的数据的实际大小。看一个小例子:[cpp] view plain copy/ zlibDemo.cpp : 定义控制台应用程序的入口点。  
//  
  
#include "stdafx.h"  
#include "zlib.h"  
#include <assert.h>  
#include <Windows.h>  
#include <iostream>  
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<<"获取模块函数地址失败!"<<endl;  
            ::FreeLibrary(hIns);  
            return 1;  
        }  
        int nError=f(pBufferDes,&desLen,pBufferRes,lSize);  
        //desLen必须大于lsize,详情请参照zlib文档  
        if(nError!=Z_OK)  
        {  
            cout<<"压缩失败!"<<endl;  
            ::FreeLibrary(hIns);  
            fclose(fp1);  
            return 1;  
        }  
        cout<<"压缩成功,压缩率为: %"<<desLen/(float)lSize*100<<endl;  
    }  
    else  
    {  
        cout<<"加载库文件失败!"<<endl;  
        return 1;  
    }  
    fclose(fp1);  
    FILE* fp2=NULL;  
    fp2=fopen(pFileSave,"wb");  
    //将压缩后的信息写入文件  
    fwrite(pBufferDes,sizeof(unsigned char),desLen,fp2);  
    fclose(fp2);  
    /////////////////////////////////////////////////////////////////////////////////////////////////  
    //解压文件  
    memset(pBufferDes,0,MAX_LEN);  
    memset(pBufferRes,0,MAX_LEN);  
    fp1=fopen("..\\Debug\\1.zip","rb");  
    desLen=fread(pBufferRes,1,desLen,fp1);  
    typedef int (*unFun)(Bytef*,uLongf*,const Bytef*,uLongf);  
    unFun uf=NULL;  
    uf=(unFun)GetProcAddress(hIns,"uncompress");  
    uLongf unSize;  
    if(uf)  
    {  
        int nRet=uf(pBufferDes,&unSize,pBufferRes,desLen);  
        ::FreeLibrary(hIns);  
        if(nRet!=Z_OK)  
        {  
            cout<<"解压缩失败"<<endl;  
            fclose(fp1);  
            return 1;  
        }  
    }  
    fclose(fp1);  
    fp2=fopen("..\\Debug\\uncompress.xml","wb");  
    fwrite(pBufferDes,1,unSize,fp2);  
    fclose(fp2);  
    cout<<"成功解压文件"<<pFileSave<<"到uncompress.xml"<<endl;  
[cpp] view plain copy    //释放申请的内存空间  
    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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  zip