muduo库阅读(37)——Net部分:压缩数据流ZlibOutputStream
来源:互联网 发布:淘宝店怎么上传宝贝 编辑:程序博客网 时间:2024/05/21 10:45
/* * 压缩数据流 * 输入是普通数据流,输出是压缩数据流 */class ZlibOutputStream : boost::noncopyable{public:// 初始化explicit ZlibOutputStream(Buffer* output): output_(output), zerror_(Z_OK), bufferSize_(1024){bzero(&zstream_, sizeof zstream_);// 初始化压缩数据流zerror_ = deflateInit(&zstream_, Z_DEFAULT_COMPRESSION);}~ZlibOutputStream(){finish();}// 返回错误信息const char* zlibErrorMessage() const { return zstream_.msg; }// 返回错误码int zlibErrorCode() const { return zerror_; }// 返回输入流的字节数int64_t inputBytes() const { return zstream_.total_in; }// 返回输出流的字节数int64_t outputBytes() const { return zstream_.total_out; }// 内部缓冲区的大小int internalOutputBufferSize() const { return bufferSize_; }// 写入数据,然后进行压缩bool write(StringPiece buf){if (zerror_ != Z_OK)return false;assert(zstream_.next_in == NULL && zstream_.avail_in == 0);void* in = const_cast<char*>(buf.data());// 设置压缩数据起始位置和长度zstream_.next_in = static_cast<Bytef*>(in);zstream_.avail_in = buf.size();// 压缩while (zstream_.avail_in > 0 && zerror_ == Z_OK){zerror_ = compress(Z_NO_FLUSH);}if (zstream_.avail_in == 0){assert(static_cast<const void*>(zstream_.next_in) == buf.end());zstream_.next_in = NULL;}return zerror_ == Z_OK;}// 输入数据并进行压缩bool write(Buffer* input){if (zerror_ != Z_OK)return false;void* in = const_cast<char*>(input->peek());zstream_.next_in = static_cast<Bytef*>(in);zstream_.avail_in = static_cast<int>(input->readableBytes());// 压缩if (zstream_.avail_in > 0 && zerror_ == Z_OK){zerror_ = compress(Z_NO_FLUSH);}input->retrieve(input->readableBytes() - zstream_.avail_in);return zerror_ == Z_OK;}// 刷新bool finish(){if (zerror_ != Z_OK)return false;while (zerror_ == Z_OK){// 冲刷zerror_ = compress(Z_FINISH);}zerror_ = deflateEnd(&zstream_);bool ok = zerror_ == Z_OK;zerror_ = Z_STREAM_END;return ok;}private:// 压缩int compress(int flush){output_->ensureWritableBytes(bufferSize_);zstream_.next_out = reinterpret_cast<Bytef*>(output_->beginWrite());zstream_.avail_out = static_cast<int>(output_->writableBytes());// 压缩数据int error = ::deflate(&zstream_, flush);output_->hasWritten(output_->writableBytes() - zstream_.avail_out);if (output_->writableBytes() == 0 && bufferSize_ < 65536){bufferSize_ *= 2;}return error;}// 输出缓冲区Buffer* output_;// 压缩的数据流z_stream zstream_;// 错误码int zerror_;// 缓冲区的大小int bufferSize_;};
0 0
- muduo库阅读(37)——Net部分:压缩数据流ZlibOutputStream
- muduo库阅读(43)——Net部分:轮询器的epoll实现——EPollPoller
- muduo库阅读(29)——Net部分:Reactor(EventLoop事件循环)
- muduo库阅读(31)——Net部分:定时器(计时器)Timer
- muduo库阅读(32)——Net部分:定时器(计时器)ID类TimerId
- muduo库阅读(23)——Net部分:应用层缓冲区类
- muduo库阅读(24)——Net部分:网络地址类
- muduo库阅读(25)——Net部分:服务器端的套接字类
- muduo库阅读(26)——Net部分:套接字常用操作的封装
- muduo库阅读(27)——Net部分:字节顺序转换的封装
- muduo库阅读(28)——Net部分:各类回调函数的定义
- muduo库阅读(30)——Net部分:事件处理器Channel
- muduo库阅读(33)——Net部分:定时器队列TimerQueue
- muduo库阅读(34)——Net部分:轮询器基类Poller
- muduo库阅读(36)——Net部分:事件循环线程池EventLoopThreadPool
- muduo库阅读(38)——Net部分:TCP连接TcpConnection
- muduo库阅读(39)——Net部分:接收者Accpetor
- muduo库阅读(40)——Net部分:TCP服务器TcpServer
- java修改项目名称
- Qt从零开始制作串口调试助手-(第六章、添加主界面调用子界面响应)-Creator_Ly
- jquery写拖拽
- flex
- Eclipse全局搜索
- muduo库阅读(37)——Net部分:压缩数据流ZlibOutputStream
- Spark RDD中Transformation的filter、distinct、cartesian、union详解
- Android webView 支持缩放及自适应屏幕
- mysql 中不会使用索引的几种情况
- modal出一个viewController时隐藏状态栏
- 习题3-1 得分 解题报告
- 排序算法-交换排序_快速排序
- 九度oj-1205-N阶楼梯上楼问题
- 子图同构算法:VF2算法(含代码)