使用开源库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));*/
运行程序,结果如下:
![](http://img.my.csdn.net/uploads/201209/26/1348650596_8348.jpg)
下载地址: 下载zlibDemo
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));*/
运行程序,结果如下:
![](http://img.my.csdn.net/uploads/201209/26/1348650596_8348.jpg)
下载地址: 下载zlibDemo
相关文章推荐
- 使用开源库zlib压缩和解压文件
- 使用开源库zlib压缩和解压文件
- 使用开源库zlib压缩和解压文件
- C++ 压缩文件及文件夹方法 使用zlib开源库
- 【VC++技术杂谈008】使用zlib解压zip压缩文件
- 使用ZLIB生成DLL文件,并进行有中文的ZIP文件压缩与解压操作!支持目录压与解!
- 使用 ZLib 压缩/解压 ZIP 文件
- 使用 ZLib 压缩/解压 ZIP 文件
- C++ 压缩文件及文件夹 使用zlib开源库
- 使用 ZLib 压缩/解压 ZIP 文件
- 使用 ZLib 压缩/解压 ZIP 文件
- 使用 ZLib 压缩/解压 ZIP 文件
- 使用apache的工具类进行zip(rar等压缩文件)的解压
- 【转载】使用C#2.0进行文件压缩和解压
- C++ zlib 压缩解压文件
- 使用C#2.0进行文件压缩和解压
- 使用zlib压缩解压缩文件的详细过程
- 使用zlib压缩解压缩文件的详细过程
- Delphi使用zlib来压缩文件
- Delphi使用zlib来压缩文件