亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

zlib庫壓縮和解壓字符串STL string的實例詳解

2020-05-23 13:35:18
字體:
來源:轉載
供稿:網友

zlib庫壓縮和解壓字符串STL string的實例詳解

場景

1.一般在使用文本json傳輸數據, 數據量特別大時,傳輸的過程就特別耗時, 因為帶寬或者socket的緩存是有限制的, 數據量越大, 傳輸時間就越長. 網站一般使用gzip來壓縮成二進制.

說明

1.zlib庫可以實現gzip和zip方式的壓縮, 這里只介紹zip方式的二進制壓縮, 壓縮比還是比較可觀的, 一般寫客戶端程序已足夠.

2.修改了一下zpipe.c的實現, 其實就是把讀文件改為讀字符串, 寫文件改為寫字符串即可.

例子

// test_zlib.cpp : 定義控制臺應用程序的入口點。//#include "stdafx.h"#include <string>#include <iostream>#include <memory>#include <assert.h>#include "zlib.h"// E:/software/Lib/compress/zlib-1.2.5/src/examples// zpipe.c#define CHUNK 16384/* Compress from file source to file dest until EOF on source.  def() returns Z_OK on success, Z_MEM_ERROR if memory could not be  allocated for processing, Z_STREAM_ERROR if an invalid compression  level is supplied, Z_VERSION_ERROR if the version of zlib.h and the  version of the library linked do not match, or Z_ERRNO if there is  an error reading or writing the files. */int CompressString(const char* in_str,size_t in_len,  std::string& out_str, int level){  if(!in_str)    return Z_DATA_ERROR;  int ret, flush;  unsigned have;  z_stream strm;  unsigned char out[CHUNK];  /* allocate deflate state */  strm.zalloc = Z_NULL;  strm.zfree = Z_NULL;  strm.opaque = Z_NULL;  ret = deflateInit(&strm, level);  if (ret != Z_OK)    return ret;  std::shared_ptr<z_stream> sp_strm(&strm,[](z_stream* strm){     (void)deflateEnd(strm);  });  const char* end = in_str+in_len;  size_t pos_index = 0;  size_t distance = 0;  /* compress until end of file */  do {    distance = end - in_str;    strm.avail_in = (distance>=CHUNK)?CHUNK:distance;    strm.next_in = (Bytef*)in_str;    // next pos    in_str+= strm.avail_in;    flush = (in_str == end) ? Z_FINISH : Z_NO_FLUSH;    /* run deflate() on input until output buffer not full, finish      compression if all of source has been read in */    do {      strm.avail_out = CHUNK;      strm.next_out = out;      ret = deflate(&strm, flush);  /* no bad return value */      if(ret == Z_STREAM_ERROR)        break;      have = CHUNK - strm.avail_out;      out_str.append((const char*)out,have);    } while (strm.avail_out == 0);    if(strm.avail_in != 0);   /* all input will be used */      break;    /* done when last data in file processed */  } while (flush != Z_FINISH);  if(ret != Z_STREAM_END) /* stream will be complete */    return Z_STREAM_ERROR;  /* clean up and return */  return Z_OK;}/* Decompress from file source to file dest until stream ends or EOF.  inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be  allocated for processing, Z_DATA_ERROR if the deflate data is  invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and  the version of the library linked do not match, or Z_ERRNO if there  is an error reading or writing the files. */int DecompressString(const char* in_str,size_t in_len, std::string& out_str){  if(!in_str)    return Z_DATA_ERROR;  int ret;  unsigned have;  z_stream strm;  unsigned char out[CHUNK];  /* allocate inflate state */  strm.zalloc = Z_NULL;  strm.zfree = Z_NULL;  strm.opaque = Z_NULL;  strm.avail_in = 0;  strm.next_in = Z_NULL;  ret = inflateInit(&strm);  if (ret != Z_OK)    return ret;  std::shared_ptr<z_stream> sp_strm(&strm,[](z_stream* strm){     (void)inflateEnd(strm);  });  const char* end = in_str+in_len;  size_t pos_index = 0;  size_t distance = 0;  int flush = 0;  /* decompress until deflate stream ends or end of file */  do {    distance = end - in_str;    strm.avail_in = (distance>=CHUNK)?CHUNK:distance;    strm.next_in = (Bytef*)in_str;    // next pos    in_str+= strm.avail_in;    flush = (in_str == end) ? Z_FINISH : Z_NO_FLUSH;    /* run inflate() on input until output buffer not full */    do {      strm.avail_out = CHUNK;      strm.next_out = out;      ret = inflate(&strm, Z_NO_FLUSH);      if(ret == Z_STREAM_ERROR) /* state not clobbered */        break;      switch (ret) {      case Z_NEED_DICT:        ret = Z_DATA_ERROR;   /* and fall through */      case Z_DATA_ERROR:      case Z_MEM_ERROR:        return ret;      }      have = CHUNK - strm.avail_out;      out_str.append((const char*)out,have);    } while (strm.avail_out == 0);    /* done when inflate() says it's done */  } while (flush != Z_FINISH);  /* clean up and return */  return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;}int _tmain(int argc, _TCHAR* argv[]){  const char* buf = "01010101010101010101010000000000000000000000000000011111111111111"    "01010101010101010101010000000000000000000000000000011111111111111"    "01010101010101010101010000000000000000000000000000011111111111111"    "01010101010101010101010000000000000000000000000000011111111111111"    "01010101010101010101010000000000000000000000000000011111111111111"    "01010101010101010101010000000000000000000000000000011111111111111"    "01010101010101010101010000000000000000000000000000011111111111111"    "01010101010101010101010000000000000000000000000000011111111111111"    "01010101010101010101010000000000000000000000000000011111111111111"    "01010101010101010101010000000000000000000000000000011111111111111"    "qwertyuiop[]";  std::cout << "========= CompressString ===========" << std::endl;  std::cout << "Source Buffer Size: " << strlen(buf) << std::endl;  std::string out_compress;  assert(CompressString(buf,strlen(buf),out_compress,Z_DEFAULT_COMPRESSION) == Z_OK);  std::cout << "Compress Buffer Size: " << out_compress.size() << std::endl;  std::cout << "========= DecompressString ===========" << std::endl;  std::string out_decompress;  assert(DecompressString(out_compress.c_str(),out_compress.size(),out_decompress) == Z_OK);  std::cout << "Decompress Buffer Size: " << out_decompress.size() << std::endl;  assert(!out_decompress.compare(buf));  return 0;}

輸出:

========= CompressString ===========Source Buffer Size: 662Compress Buffer Size: 38========= DecompressString ===========Decompress Buffer Size: 662

參考

zlib/src/examples/zpipe.c

C++ Code Snippet - Compressing STL Strings with zlib

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
岛国精品视频在线播放| 久久精品中文字幕一区| 亚洲欧洲免费视频| 日韩女优人人人人射在线视频| 国产精品久久久久久一区二区| 亚洲免费成人av电影| 久久99视频免费| 91av在线精品| 亚洲女人初尝黑人巨大| 一区二区在线免费视频| 久久国产精品久久久久| 国产精品成人免费电影| 欧美日韩在线一区| 国产视频在线观看一区二区| 国产亚洲视频在线观看| 欧美大片在线看免费观看| 午夜精品久久久久久久99黑人| 成人黄色中文字幕| 8090理伦午夜在线电影| 国产成人a亚洲精品| 伊人精品在线观看| 亚洲精品98久久久久久中文字幕| 久久99久久亚洲国产| 成人黄色生活片| 精品亚洲夜色av98在线观看| 国产欧美一区二区三区视频| 亚洲精品美女视频| 久久色在线播放| 成人久久18免费网站图片| 欧美精品亚州精品| 亚洲一区二区中文| 亚洲激情第一页| 欧美福利视频网站| 成人黄色中文字幕| 欧美日韩国产成人在线观看| 有码中文亚洲精品| 国产成+人+综合+亚洲欧美丁香花| 久久视频在线播放| 91在线精品视频| 久久亚洲电影天堂| 欧美亚洲日本网站| 91久久久久久国产精品| 亚洲精品wwww| 亚洲bt欧美bt日本bt| 九九视频这里只有精品| 欧美性猛交丰臀xxxxx网站| 久久激情视频久久| 91国产在线精品| 国产日本欧美一区二区三区| 国产欧美婷婷中文| 欧美性色xo影院| 中文字幕欧美国内| 亚洲在线观看视频网站| 欧美一级片在线播放| 欧美性色视频在线| 国产精品久久久久久久一区探花| 夜夜嗨av一区二区三区免费区| 日本欧美中文字幕| 午夜精品99久久免费| 在线成人中文字幕| 国产成人短视频| 久久精品国产久精国产一老狼| 日本精品久久久久久久| 美女福利精品视频| 国产精品视频一区二区高潮| 在线看日韩欧美| 9.1国产丝袜在线观看| 疯狂做受xxxx欧美肥白少妇| 欧美激情视频在线| 久久久久久久97| 亚洲综合中文字幕在线| 亚洲欧洲美洲在线综合| 九九精品在线播放| 欧美裸体xxxx极品少妇软件| 成人免费黄色网| 亚洲精品综合久久中文字幕| xxx成人少妇69| 久久综合免费视频影院| 日韩中文在线中文网三级| 亚洲精品电影在线观看| 91夜夜未满十八勿入爽爽影院| 91亚洲精品在线| 欧美日韩性视频| 欧美成人中文字幕在线| 国产福利精品在线| 亚洲www在线观看| 久久色精品视频| 久久在线免费观看视频| 欧美视频裸体精品| 午夜精品美女自拍福到在线| 亚洲欧美一区二区三区四区| 国产精品综合网站| 深夜福利91大全| 亚洲福利在线观看| 日韩精品免费在线| 91精品国产色综合久久不卡98口| 日韩精品视频在线| 日韩成人黄色av| 欧美性感美女h网站在线观看免费| 91国产视频在线播放| 亚洲精品视频网上网址在线观看| 性视频1819p久久| 国产精品久久久久久久av电影| 国产精品你懂得| 97久久国产精品| 91在线观看免费观看| 亚洲国产精品电影在线观看| 欧美成人在线免费| 亚洲综合第一页| 98精品国产自产在线观看| 午夜欧美大片免费观看| zzjj国产精品一区二区| 欧美在线中文字幕| 国内自拍欧美激情| 国内精品小视频在线观看| 欧美国产日产韩国视频| 亚洲一区二区三区四区在线播放| 精品久久久久久久久久ntr影视| 亚洲精品aⅴ中文字幕乱码| 黑丝美女久久久| 欧美电影免费在线观看| 中文字幕亚洲一区二区三区五十路| 欧美性xxxx极品hd欧美风情| 麻豆成人在线看| 精品视频在线播放| 久久亚洲精品国产亚洲老地址| 欧美美最猛性xxxxxx| 日韩电影在线观看中文字幕| 在线观看国产精品91| 日韩高清欧美高清| 国产欧美日韩综合精品| 欧美日韩免费一区| 91在线观看免费| 成人午夜在线观看| 成人妇女免费播放久久久| 日韩中文字幕免费| 91精品国产自产91精品| 色av吧综合网| 精品国模在线视频| 成人欧美一区二区三区在线| 亚洲精品99999| 综合av色偷偷网| 精品人伦一区二区三区蜜桃免费| …久久精品99久久香蕉国产| 亚洲福利影片在线| 久久久99免费视频| 亚洲欧美国产精品专区久久| 国产一区二区激情| 在线观看中文字幕亚洲| 国产在线视频欧美| 日韩在线免费高清视频| 中文字幕亚洲自拍| 国产99久久精品一区二区| 欧洲永久精品大片ww免费漫画| 欧美精品亚州精品| 亚洲国产99精品国自产| 亚洲精品一区二区久| 成人午夜激情免费视频| 国外日韩电影在线观看| 亚洲最新中文字幕| 亚洲欧美日韩一区二区在线| 中文字幕在线观看日韩| 黑人巨大精品欧美一区二区免费| 亚洲人成电影网站色xx|