博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zlib deflate and inflate class for c++
阅读量:7304 次
发布时间:2019-06-30

本文共 4604 字,大约阅读时间需要 15 分钟。

hot3.png

Compression.h
/* * Compression.h * *  Created on: Aug 26, 2013 *      Author: jerome */#ifndef COMPRESSION_H_#define COMPRESSION_H_#include 
#include
#include
#include
#define COMPRESSION_LEVEL Z_DEFAULT_COMPRESSION#define BUFFER_SIZE 16384typedef std::vector
StlVecUnChar;class Compression{public: enum CompressLevel { NO_COMPRESSION = Z_NO_COMPRESSION, BEST_SPEED = Z_BEST_SPEED, BEST_COMPRESSION = Z_BEST_COMPRESSION, DEFAULT_COMPRESSION = Z_DEFAULT_COMPRESSION }; Compression() : m_zstream(), m_IsCompress(true), m_bufferInCapa(BUFFER_SIZE), m_bufferOutCapa(BUFFER_SIZE), m_compressLevel(DEFAULT_COMPRESSION) { } Compression(bool isCom, CompressLevel level = DEFAULT_COMPRESSION) : m_zstream(), m_IsCompress(isCom), m_bufferInCapa(BUFFER_SIZE), m_bufferOutCapa(BUFFER_SIZE), m_compressLevel(level) { } virtual ~Compression(); int Init(); int Deflate(const StlVecUnChar &inStr, StlVecUnChar &outStr); int Inflate(const StlVecUnChar &inStr, StlVecUnChar &outStr);private: z_stream m_zstream; // Stream structure used by zlib bool m_IsCompress; // True: compress. False: decompress unsigned char m_bufferIn[BUFFER_SIZE]; // Input buffer for zlib unsigned char m_bufferOut[BUFFER_SIZE];// Output Buffer for zlib const int m_bufferInCapa; // Input buffer capacity const int m_bufferOutCapa; // Output buffer capacity CompressLevel m_compressLevel; // Compress level};#endif /* COMPRESSION_H_ */
Compression.cpp
/* * Compression.cpp * *  Created on: Aug 26, 2013 *      Author: jerome */#include "Compression.h"#include 
#include
#include
Compression::~Compression() { // TODO Auto-generated destructor stub}int Compression::Init(){ int ret; m_zstream.zalloc = NULL; m_zstream.zfree = NULL; m_zstream.opaque = NULL; if(m_IsCompress) { ret = deflateInit2_(&m_zstream, m_compressLevel, Z_DEFLATED, MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY, ZLIB_VERSION, sizeof(z_stream)); } else { ret = inflateInit2_(&m_zstream, MAX_WBITS, ZLIB_VERSION, sizeof(z_stream)); } return ret;}int Compression::Deflate(const StlVecUnChar &inStr, StlVecUnChar &outStr){ int ret; int flush; size_t lastByte = inStr.size (); int have = 0; while (lastByte > 0) { if (lastByte > m_bufferInCapa) { memcpy (m_bufferIn, &inStr[inStr.size () - lastByte], m_bufferInCapa); lastByte -= m_bufferInCapa; m_zstream.avail_in = m_bufferInCapa; flush = Z_NO_FLUSH; } else { memcpy (m_bufferIn, &inStr[inStr.size () - lastByte], lastByte); m_zstream.avail_in = lastByte; lastByte = 0; flush = Z_FINISH; } m_zstream.next_in = m_bufferIn; do { m_zstream.avail_out = m_bufferOutCapa; m_zstream.next_out = m_bufferOut; ret = deflate(&m_zstream, flush); assert(ret != Z_STREAM_ERROR); have = m_bufferOutCapa - m_zstream.avail_out; outStr.insert (outStr.end (), m_bufferOut, m_bufferOut + have); }while(m_zstream.avail_out == 0); assert(m_zstream.avail_in == 0); } // Finish deflate (void)deflateEnd(&m_zstream); return Z_OK;}int Compression::Inflate(const StlVecUnChar &inStr, StlVecUnChar &outStr){ int ret; int lastByte = inStr.size(); int have = 0; while (lastByte > 0) { if (lastByte > m_bufferInCapa) { memcpy(m_bufferIn, &inStr[inStr.size () - lastByte], m_bufferInCapa); lastByte -= m_bufferInCapa; m_zstream.avail_in = m_bufferInCapa; } else { memcpy(m_bufferIn, &inStr[inStr.size () - lastByte], lastByte); m_zstream.avail_in = lastByte; lastByte = 0; } m_zstream.next_in = m_bufferIn; do { m_zstream.next_out = m_bufferOut; m_zstream.avail_out = m_bufferOutCapa; ret = inflate(&m_zstream, Z_NO_FLUSH); assert(ret != Z_STREAM_ERROR); switch(ret) { case Z_NEED_DICT: ret = Z_DATA_ERROR; case Z_DATA_ERROR: case Z_MEM_ERROR: (void)inflateEnd(&m_zstream); return ret; } have = m_bufferOutCapa - m_zstream.avail_out; outStr.insert (outStr.end (), m_bufferOut, m_bufferOut + have); }while(m_zstream.avail_out == 0); } (void)inflateEnd(&m_zstream); return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;}

转载于:https://my.oschina.net/jeromecui/blog/157070

你可能感兴趣的文章
PHP数组操作汇总
查看>>
一本比较简单易懂的中文python入门教程
查看>>
如何使用图形界面Webmin管理linux服务器
查看>>
C# 天气预报
查看>>
那些不怕失业的程序员们,都有什么技能?
查看>>
一个可以拖拽的异步按需加载树
查看>>
为什么要评审代码?
查看>>
echarts图表第一个案例
查看>>
Swift UITableView嵌套UICollectionView点击事件冲突(点击事件穿透)
查看>>
利用System.Net.Mail和多线程实现邮件发送
查看>>
代币合约代码
查看>>
Java程序员从阿里、百度面试回来,这些面试题你们会吗?
查看>>
配置Java_Home,临时环境变量信息
查看>>
SharePoint 2010 network load balance 负载均衡配置
查看>>
Webpack介绍和使用(配置环境变量,打包依赖)
查看>>
多重部分和问题
查看>>
人工智能最佳学习实践
查看>>
bzoj 1901: Zju2112 Dynamic Rankings
查看>>
JS关于时间的一些计算与获取
查看>>
JQuery.Ajax()的data参数传递方式
查看>>