关于zlib压缩和解压缩

来源:互联网 发布:windows 查看命令路径 编辑:程序博客网 时间:2024/05/22 16:52

Zib应用场景

         1)节约空间

        当需要将一个很占内存的变量写入文件以节省内存时,可以先压缩一下,然后写入文件,当需要使用时再从文件中读出,然后解压缩,以便节省IO时间。此外,有些情况可能还要序列化一下,当要压缩的内存不是一段连续的内存的时候。


      
2)节约网络流量     

        待发送的数据包比较大,且网络流量有限时,这两个函数也能派上用场。发送数据包前,先将数据包buffer压缩一下;接收方收到数据后再解压一下,这样接收方就能得到原始数据了。

 

作用功能:

使用c++将文件压缩成zip文件,然后使用解压缩恢复成原文件。

使用vs建工程后放入源码:


#include <cstring>#include <cstdlib>#include <iostream>#include "zlib.h"using namespace std;int Compress(char * DestName, const char *SrcName);int UnCompress(char * DestName, const char *SrcName);int main() {Compress("1.zip", "11.docx");UnCompress("22.docx", "1.zip");}int Compress(char * DestName, const char *SrcName){char SourceBuffer[102400] = { 0 };  //压缩文件时的源bufferFILE* fp;  //打开欲压缩文件时文件的指针FILE* fp1;  //创建压缩文件时的指针 errno_t err; //错误变量的定义#ifdef WINDOWS_PLATFORMerr = fopen_s(&fp, SrcName, "r+b");//打开欲压缩的文件if (err){printf("文件打开失败! \n");return 1;}#endif #ifdef    WINDOWS_CE_PLATFORMfp = fopen_s(SrcName, "r+b");//打开欲压缩的文件if (fp){printf("文件打开失败! \n");return 1;}#endif err = fopen_s(&fp, SrcName, "r+b");//打开欲压缩的文件if (err){printf("文件打开失败! \n");return 1;}//获取文件长度long cur = ftell(fp);fseek(fp, 0L, SEEK_END);long fileLength = ftell(fp);fseek(fp, cur, SEEK_SET);//读取文件到bufferfread(SourceBuffer, fileLength, 1, fp);fclose(fp);//压缩buffer中的数据uLongf SourceBufferLen = 102400;char* DestBuffer = (char*)::calloc((uInt)SourceBufferLen, 1);err = compress((Bytef*)DestBuffer, (uLongf*)&SourceBufferLen, (const Bytef*)SourceBuffer, (uLongf)fileLength);if (err != Z_OK){cout << "压缩失败:" << err << endl;return 1;}//创建一个文件用来写入压缩后的数据err = fopen_s(&fp1, DestName, "w+b");if (!fp1){printf("压缩文件创建失败! \n");return 1;}fwrite(DestBuffer, SourceBufferLen, 1, fp1);fclose(fp1);return 0;}int UnCompress(char * DestName, const char *SrcName){char uSorceBuffer[102400] = { 0 };  //解压缩文件时的源bufferFILE* fp3;  //打开欲解压文件的文件指针FILE* fp4;  //创建解压文件的文件指针errno_t err; //错误变量的定义 //打开欲解压的文件err = fopen_s(&fp3, SrcName, "r+b");if (err){printf("文件打开失败! \n");return 1;}//获取欲解压文件的大小long ucur = ftell(fp3);fseek(fp3, 0L, SEEK_END);long ufileLength = ftell(fp3);fseek(fp3, ucur, SEEK_SET);//读取文件到bufferfread(uSorceBuffer, ufileLength, 1, fp3);fclose(fp3);uLongf uDestBufferLen = 1024000;//此处长度需要足够大以容纳解压缩后数据char* uDestBuffer = (char*)::calloc((uInt)uDestBufferLen, 1);//解压缩buffer中的数据err = uncompress((Bytef*)uDestBuffer, (uLongf*)&uDestBufferLen, (Bytef*)uSorceBuffer, (uLongf)ufileLength);if (err != Z_OK){cout << "解压缩失败:" << err << endl;return 1;}//创建一个文件用来写入解压缩后的数据err = fopen_s(&fp4, DestName, "wb");if (err){printf("解压缩文件创建失败! \n");return 1;}printf("写入数据... \n");fwrite(uDestBuffer, uDestBufferLen, 1, fp4);fclose(fp4);return 0;}


在工程文件夹中需要加入Zlib.lib以及Zlib.dll中,并且在附加依赖库中加入:




使用的Zlib.lib以及Zlib.dll不是自己本机编译的。

本机只编译好了obj文件,编译lib文件时出现问题如下:



参考文献: http://blog.csdn.net/chenlycly/article/details/40477755

成功参考:http://www.cnblogs.com/fairycao/archive/2009/12/09/1620414.html

失败参考:http://blog.chinaunix.net/uid-24599332-id-2122842.html

 

编译obj文件以及lib文件(obj成功,lib未成功):

http://blog.csdn.net/qq292386890/article/details/49620633

 

 

相关问题:

如果出现:Cannot open include file:'unistd.h': No such file or directory

可以参考:http://www.iyunv.com/thread-42241-1-1.html

 

Windows下使用命令行编译C/C++文件

参考:http://blog.csdn.net/u010602592/article/details/50525634



当然也可以直接用vs2015打开C:\zlib-1.2.11\contrib\vstudio\vc12 路径下的sln工程文件了编译(测试vc14的不通过,vc12的点进去会提升升级,升级后就能成功编译了。)


原创粉丝点击