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

首頁(yè) > 編程 > C++ > 正文

zlib庫(kù)壓縮和解壓字符串STL string的實(shí)例詳解

2020-05-23 13:38:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

zlib庫(kù)壓縮和解壓字符串STL string的實(shí)例詳解

場(chǎng)景

1.一般在使用文本json傳輸數(shù)據(jù), 數(shù)據(jù)量特別大時(shí),傳輸?shù)倪^(guò)程就特別耗時(shí), 因?yàn)閹捇蛘遱ocket的緩存是有限制的, 數(shù)據(jù)量越大, 傳輸時(shí)間就越長(zhǎng). 網(wǎng)站一般使用gzip來(lái)壓縮成二進(jìn)制.

說(shuō)明

1.zlib庫(kù)可以實(shí)現(xiàn)gzip和zip方式的壓縮, 這里只介紹zip方式的二進(jìn)制壓縮, 壓縮比還是比較可觀的, 一般寫(xiě)客戶端程序已足夠.

2.修改了一下zpipe.c的實(shí)現(xiàn), 其實(shí)就是把讀文件改為讀字符串, 寫(xiě)文件改為寫(xiě)字符串即可.

例子

// test_zlib.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。//#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

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 上饶市| 平南县| 嘉义市| 十堰市| 武城县| 崇阳县| 申扎县| 会泽县| 弥勒县| 长沙市| 兴国县| 福海县| 蕲春县| 隆德县| 郎溪县| 浠水县| 瑞昌市| 临高县| 旬邑县| 东乌珠穆沁旗| 乾安县| 渝北区| 进贤县| 永安市| 金溪县| 山东省| 英山县| 武义县| 丰原市| 城口县| 霍林郭勒市| 来安县| 贺兰县| 南通市| 信丰县| 大宁县| 曲周县| 安康市| 海安县| 衡阳市| 海晏县|