使用ZLib库压缩解压缩Demo

头文件:

#include "zlib.h"

编译:

需要加上 -lz

解压缩:

  1. #define CHUNK 100000
  2. int decodeZip(char *source,int len,char **dest)
  3. {
  4. int ret;
  5. unsigned have;
  6. z_stream strm;
  7. unsigned char out[CHUNK];
  8. int totalsize = 0;
  9. /* allocate inflate state */
  10. strm.zalloc = Z_NULL;
  11. strm.zfree = Z_NULL;
  12. strm.opaque = Z_NULL;
  13. strm.avail_in = 0;
  14. strm.next_in = Z_NULL;
  15. ret = inflateInit2(&strm, 31);
  16. if (ret != Z_OK)
  17. return ret;
  18. strm.avail_in = len;
  19. strm.next_in = (unsigned char*)source;
  20. /* run inflate() on input until output
    buffer not full */
  21. do {
  22. strm.avail_out = CHUNK;
  23. strm.next_out = out;
  24. ret = inflate(&strm, Z_NO_FLUSH);
  25. switch (ret)
  26. {
  27. case Z_NEED_DICT:
  28. ret = Z_DATA_ERROR; /* and fall
    through */
  29. case Z_DATA_ERROR:
  30. case Z_MEM_ERROR:
  31. inflateEnd(&strm);
  32. return ret;
  33. }
  34. have = CHUNK - strm.avail_out;
  35. totalsize += have;
  36. *dest = (char*)realloc(*dest,totalsize);
  37. memcpy(*dest + totalsize - have,out,have);
  38. } while (strm.avail_out == 0);
  39. /* clean up and return */
  40. inflateEnd(&strm);
  41. return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
  42. }

压缩:

  1. #define MaxLen 10000000
  2. /**
  3. * 对内容进行压缩和编码工作
  4. */
  5. void encodeZip(const string &buffer, string& zipBuf, int& zipLen)
  6. {
  7. unsigned char _zipSrc[MaxLen];
  8. unsigned char _zipDst[MaxLen];
  9. unsigned char  _scBuffer[MaxLen];
  10. //先对原始内容进行压缩工作
  11. unsigned int tmpLen = buffer.length();
  12. memcpy(_zipSrc, buffer.c_str(), tmpLen);
  13. z_stream c_stream;
  14. c_stream.zalloc = (alloc_func)0;
  15. c_stream.zfree = (free_func)0;
  16. c_stream.opaque = (voidpf)0;
  17. c_stream.next_in = (Bytef*)_zipSrc;
  18. c_stream.avail_in = tmpLen;
  19. c_stream.next_out = (Bytef*)_zipDst;
  20. c_stream.avail_out = (unsigned int)MaxLen;
  21. int ret = deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION,Z_DEFLATED, 31,8, Z_DEFAULT_STRATEGY);
  22. if(ret != Z_OK)
  23. {
  24. cout <<"|"<<"deflateInit2
    error "<<endl;
  25. return;
  26. }
  27. ret = deflate(&c_stream, Z_FINISH);
  28. if (ret != Z_STREAM_END)
  29. {
  30. deflateEnd(&c_stream);
  31. cout <<"|"<<"ret
    != Z_STREAM_END err="<< ret <<endl;
  32. return;
  33. }
  34. zipLen = c_stream.total_out;
  35. ret = deflateEnd(&c_stream);
  36. if (ret != Z_OK)
  37. {
  38. cout <<"|"<<"deflateEnd
    error "<<endl;
  39. return;
  40. }
  41. //压缩完毕进行返回包组织
  42. memcpy(_scBuffer, _zipDst, zipLen);
  43. zipBuf = string(_scBuffer, zipLen);
  44. return;
  45. }
时间: 2024-07-28 17:06:20

使用ZLib库压缩解压缩Demo的相关文章

[C/C++]_[初级]_[使用zlib库压缩文件]

场景: 1. WIndows上没找到系统提供的win32 api来生成zip压缩文件, 有知道的大牛麻烦留个言. 2. zlib比较常用,编译也方便,使用它来做压缩吧.MacOSX平台默认支持zlib库. http://zlib.net 3. zlib库里的 src\contrib\minizip\minizip.c  里有压缩例子, 我现在使用的是zlib 1.2.5,用vs2010编译完.下载地址: http://download.csdn.net/detail/infoworld/8177

ZLIB 库

zlib 编辑 zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表.zlib使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用.此函式库为自由软件,使用zlib授权.截至2007年3月,zlib是包含在Coverity的美国国土安全部赞助者选择继续审查的开源项目. 中文名 zlib 外文名 zlib 定    义 提供数据压缩用的函数库 开    发 Jean-loup Gaill

【13】MD5编码、Zlib压缩解压缩

1.MD5加密 1 /// <summary> 2 /// 使用MD5加密算法 3 /// </summary> 4 /// <param name="md5MessageStr">需要加密的字符串</param> 5 /// <returns>加密后返回字符串</returns> 6 public static string GetMD5String(string md5MessageStr) 7 { 8 usi

理解和使用zlib库 - 我个人的救赎

理解和使用zlib库 作者: 阙荣文 日期: 2016.6.2 0. 很多年以前我曾经写过一篇文章(http://blog.csdn.net/querw/article/details/1452041)简单介绍 zlib 的使用方法,老实说当时自己都不是很明白 zlib 是怎么回事,现在想起来那个时候年轻嘛,胆子大,脸皮厚...希望用一篇新的文章纪念少不更事的无知. 1. deflate算法, zlib 格式, gzip 格式 本文并不是一篇介绍压缩算法的文章,请读者自行查阅关于 LZ77 算法

Zlib库的安装与使用

在实际应用中经常会遇到要压缩数据的问题,常见的压缩格式有zip和rar,而Linux下那就更多了,bz2,gz,xz什么的都有,单单Linux下的解压和压缩命令就有好多呢?没有什么好不好的.查了资料,应该是zlib这个比较简单好用.应用也广,所以就准备用这个了. 下载Zlib库,地址: http://zlib.net/zlib128.zip 用wget下载,然后再用unzip解压一下,然后就像一般软件一样 ./configure && make && make instal

Qt之zip压缩/解压缩(QuaZIP)

摘要: 简述 QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库.适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开. 简述 QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库.适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开. Qt中提供了qCompress/qUncompress来进行文件的压缩与解压,但存在

【转】 C++使用zlib库(-)

来自:  http://blog.chinaunix.net/uid-24607609-id-2118143.html 今天看到一个gzopen函数,搜了一下他的系列函数,及相关用法 C++使用zlib库(-) 2010-10-07 09:37:35 分类: C/C++ 1.gzopen打开经过zlib算法压缩的文件gzFile gz = gzopen(char* filename,"rb");打开一个zlib的流,使用该流可以对文件进行读的操作2.gzeof用法与C中的feof相似,

[Zlib]_[初级]_[使用zlib库解压提取文件]

场景: 1. zlib库跨平台,Windows和MacOSX都可以使用,还支持64位编译,轻量级,没有不用的道理. 2. 处理.zip,apk,docx文件时,因为这类文件都是zip格式,使用zlib能方便提取压缩文件里的数据. 方法: 1. 除了要使用zlib库本身,还需要使用zlib里的contrib目录minizip部分头文件和.c文件. zlib-1.2.5/src/contrib/minizip/unzip.h unzip.c,ioapi.c,ioapi.h (windows还需要 i

linux编译zlib库的动态库so

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) zlib库是一个强大的通用的开源压缩库,用途比较广,在windows下能够很容易的编译或者拿到编译成功的二进制文件.但是linux下的比较少,本文记录一下如何编译. zlib官方网站:http://www.zlib.net 首先,下载源码来安装zlib软件包.目前最新的版本是1.2.8. #wget http://www.zlib.net/zlib-1.2.8.tar.gz 然后,解压下载的文件包. #