国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 隆昌县| 宁城县| 永寿县| 县级市| 乳山市| 额尔古纳市| 大名县| 沭阳县| 巴东县| 申扎县| 永定县| 曲阜市| 黄梅县| 老河口市| 松溪县| 和静县| 来宾市| 岑溪市| 松滋市| 顺昌县| 东山县| 玛曲县| 视频| 当涂县| 广元市| 乌什县| 剑河县| 格尔木市| 分宜县| 永吉县| 鸡泽县| 大方县| 广西| 文安县| 贵州省| 资兴市| 红原县| 略阳县| 略阳县| 来宾市| 资兴市|