关于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的点进去会提升升级,升级后就能成功编译了。)
- 关于zlib压缩和解压缩
- 关于压缩和解压缩
- ZLib的数据压缩和解压缩
- Zlib内存数据压缩和解压缩
- 使用Zlib实现压缩和解压缩
- 使用Zlib实现压缩和解压缩
- 使用Zlib实现压缩和解压缩
- Delphi : ZLib的数据压缩和解压缩
- c# 下怎么使用zlib/gzip压缩和解压缩?(GALGAME和Flash使用的压缩格式)
- 使用zlib/gzip压缩和解压缩?(Flash和GALGAME使用的压缩格式)
- 压缩和解压缩
- 压缩和解压缩
- 压缩和解压缩
- 压缩和解压缩类
- linux压缩和解压缩
- Linux 压缩和解压缩
- 压缩和解压缩
- java 压缩和解压缩
- 关于拆分POJO类的一些思考
- 根据电话号码获得联系人头像
- Chapter 1 预备知识
- pureMVC框架基础
- 628. Maximum Product of Three Numbers
- 关于zlib压缩和解压缩
- 用友uap nc65开发-单据联查相关开发
- 提取数字、英文、中文、过滤重复字符等SQL函数(含判断字段是否有中文)
- 邮件服务器配置(notes篇):lotus notes 9.0.1安装及配置
- 欧姆龙PLC分频电路
- Hibernate(四)一对多映射 补充一:单向一对多关系(班级->学生)
- MySQL向表中插入数据
- csdn如何转载别人的文章
- spring-boot项目在外部tomcat环境下部署