Boost::iostreams 库编译和压缩数据流

时间:2022-09-08 23:51:45

摘要


好记忆不如烂笔头,很多时候当时明明弄得很透彻的东西,很可能过段时间就全部的忘记了。


内容

  • 1. iostreams库编译和简介
  • 2. boost流
  • 3. boost 数据流压缩

1. iostreams 库编译

Boost.Iostreams 有三个目标:

  • 提供一个定义 Filters过滤器 的框架,将它们用于标准流和流缓冲。
  • 提供一组可用的过滤器、来源和接收器。

例如,Boost.Iostreams 可用于创建访问TCP连接的流,或者用作加密和数据压缩的框架。本库包括以下组件:访问 内存映象文件,用操作系统的 文件描述符 进行文件访问,代码转换,用 正则表达式 进行文本过滤,换行符转换,以及 zlibgzip 和 bzip2 格式的压缩与解压。

上面是官方文档对boost.iostreams库,简要的概括和用途介绍,这里我主要介绍下后面zlib,gzip格式压缩解压。

先介绍一下iostreams库编译build

其实iostreams大部分属于只依赖头文件,如 streamstream_buffer,filtering_stream 和 filtering_streambuf 

Header Source File External Library
boost/iostreams/device/file_descriptor.hpp file_descriptor.cpp -
boost/iostreams/device/mapped_file.hpp mapped_file.cpp -
boost/iostreams/filter/bzip2.hpp bzip2.cpp libbz2
boost/iostreams/filter/gzip.hpp gzip.cppzlib.cpp zlib
boost/iostreams/filter/regex.hpp - Boost.Regex
boost/iostreams/filter/zlib.hpp zlib.cpp zlib

变量 解释 缺省
NO_COMPRESSION 关闭压缩过滤器的支持 -
NO_BZIP2 关闭 bzip2 过滤器的支持 1 (Windows)
BZIP2_BINARY libbz2 二进制文件的名字,不包括文件扩展名,及UNIX的 "lib" 前缀。对于 Windows, 如果链接 libbz2 的动态构建,指定导入库的名字 bz2 (UNIX)
libbz2 (Windows)
BZIP2_INCLUDE libbz2 头文件的路径,如果它们不是位于可以自动找到的位置 BZIP2_SOURCE
BZIP2_LIBPATH libbz2 二进制文件的路径,如果它们不是位于可以自动找到的位置。对于 Windows, 如果链接 libbz2 的动态构建,指定导入库的名字 -
BZIP2_SOURCE Path to the libbz2 源文件的路径,如果它们不是位于可以自动找到的位置 -
NO_ZLIB 关闭 zlib 过滤器的支持 1 (Windows)
ZLIB_BINARY zlib 二进制文件的名字,不包括文件扩展名,及UNIX的 "lib" 前缀。对于 Windows, 如果链接 libbz2 的动态构建,指定导入库的名字 z (UNIX)
zdll (Windows)
ZLIB_INCLUDE zlib 头文件的路径,如果它们不是位于可以自动找到的位置 ZLIB_SOURCE
ZLIB_LIBPATH zlib 二进制文件的路径,如果它们不是位于可以自动找到的位置。对于 Windows, 如果链接 zlib 的动态构建,指定导入库的名字 -
ZLIB_SOURCE zlib 源文件的路径,如果它们不是位于可以自动找到的位置 -

   上面已经说明很清楚,对于压缩流zlib,gzip,bzip2需要依赖外库libbz2和zlib库,当然boost是对zlib库函数基础上进行的封装。

1. 下载zlib和libbz2源码包。

     zlib源码包:http://www.zlib.net/

     libbz2源码包:http://www.bzip.org/

2. 设置源码包路径

         ZLIB_INCLUDE和BZIP2_SOURCE

如在unix下面编译可以设置在环境变量中

export ZLIB_INCLUDE=$INSTALL_PATH
export BZIP2_SOURCE=$INSTALL_PATH

下面我们直接编译就好了

 ./bjam --toolset=gcc --with-iostreams  runtime-link=static link=static stage 

2. boost流

类模板 stream_buffer 和 stream 实现了标准的流缓冲和流,它们通过委托给内含的 设备 来执行 I/O。可以通过使用成员函数 open,is_open 和 close 来访问设备,它们提供了类似于标准的基于文件的流和流缓冲的接口。
对于过滤,Boost.Iostreams 提供了模板 filtering_streambuf 和 filtering_streamfiltering_streambuf 或 filtering_stream 的实例含有过滤器和设备的 chains链,使用类似于std::stack 的接口来访问。


3. boost 数据流压缩

重点介绍下数据流的压缩,正如前面所说,可用于创建访问TCP连接的流,或者用作加密和数据压缩的框架,可以将通信中的数据流进行压缩,或者加上一些加密算法从而达到传输效率和传输安全性能上的提高。



参考文章:
 boost 官方文档