boost 处理压缩解压缩
boost::iostreams主要有两类东西组成,一个是device,另一个是filter,可以到源码目录下找,iostreams目录下有这两个目录可以找到相关类。
device像是一种设备,不能单独使用,要配合普通流stream或stream_buffer来使用,可将流中的数据输入/输出到这个设备上,可分为
Source,它以读取的方式访问字符序列,如:file_source 做文件输入。
Sink,它以写的方式访问字符序列,如:file_sink 做文件输出。
stream<file_source> 那么这个就是一个文件输入流,类似于ifilestream,而stream<file_sink>就是一个文件输出流,类似于ofilestream。
filter像一种过滤器,和device一样,也是不能单独使用的,要配合过滤流filtering_stream或filtering_streambuf来使用,将流中的数据按一种规则过滤,可分为:
InputFilter,过滤通过Source读取的输入,如:gzip_decompressor 按gzip算法解压流中的数据。
OutputFilter,过滤向Sink写入的输出,如:gzip_compressor 按gzip算法压缩流中的数据。
但filtering_stream是要维护一个filter的链表的,以device为结束。输出过滤流filtering_ostream,是按顺序执行filter,然后再输出到devic上,如:
压缩时
filtering_ostream out;
out.push(gzip_compressor()); //gzip OutputFilter
out.push(bzip2_compressor());//bzip2 OutputFilter
out.push(boost::iostreams::file_sink("test.txt"));//以file_sink device结束
这就会将流的数据先按gzip压缩,然后再按bzip2压缩之后,才输出到text.txt文件中。
解压时
filtering_istream in;
in.push(gzip_decompressor());/gzip InputFilter
in.push(bzip2_decompressor());/bzip2 InputFilter
in.push(file_source("test.txt"));
这时候先将test.txt文件中数据读出,然后按bzip2解压,然后再按gzip解压,存入in流中,正好是压缩的逆序。
要使用zlib压缩,首先需要通过boost编译zlib。
- 1下载zlib(http://www.zlib.net/)
- 2,设置 zlib的路径(进入 dos 界面)
- set ZLIB_SOURCE=" E:/zlib-1.2.8"
- 3编译
- bjam --toolset=msvc-9.0 --with-iostreams --build-type=complete
- 注:zlib不需要提前编译
附实现代码
- #include <boost/iostreams/filtering_stream.hpp>
- #include <boost/iostreams/copy.hpp>
- #include <boost/iostreams/filter/zlib.hpp>
- #include <boost/iostreams/device/file_descriptor.hpp>
- #include <boost/iostreams/device/file.hpp>
- #include <iostream>
- #include <sstream>
- int main()
- {
- try{
- std::stringstream ss_comp;
- boost::iostreams::filtering_ostream out;
- out.push(boost::iostreams::zlib_compressor());
- //out.push(ss_comp); //压缩到字符流中
- out.push(boost::iostreams::file_sink("test.txt")); //压缩到文件中
- boost::iostreams::copy(std::stringstream("hello"), out);
- std::cout << "compressor data:" << ss_comp.str() << std::endl;
- std::stringstream ss_decomp;
- boost::iostreams::filtering_istream in;
- in.push(boost::iostreams::zlib_decompressor());
- //in.push(ss_comp); //从字符流中解压
- in.push(boost::iostreams::file_source("test.txt")); //从文件中解压
- boost::iostreams::copy(in, ss_decomp);
- std::cout << "decompressor data:" << ss_decomp.str() << std::endl;
- }
- catch(std::exception& e)
- {
- std::cout << "exception:" << e.what() << std::endl;
- }
- catch(...)
- {
- std::cout << "unknown exception." << std::endl;
- }
- system("pause");
- return 0;
- }
针对解压buffer,gzip为如下代码
std::stringstream ss_decomp;
std::string result_str;
boost::iostreams::filtering_istream in;
in.push(boost::iostreams::gzip_decompressor());
//in.push(ss_comp); //从字符流中解压
in.push(boost::iostreams::array_source(buffer,size)); //从文件中解压
boost::iostreams::copy(in, ss_decomp);
result_str = ss_decomp.str();
boost 处理压缩解压缩相关推荐
- asp.net利用RAR实现文件压缩解压缩【月儿原创】
asp.net利用RAR实现文件压缩解压缩 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.6.13 如果服务器上安装了RAR程 ...
- linux xz 解压initrd.img,2016-8-28 linux基础学习——压缩解压缩及归档 while脚本
文件管理命令----压缩解压缩及归档基本工具 压缩.解压缩命令 压缩格式:gz, bz2, xz, zip, Z 压缩算法:算法不同,压缩比也会不同: 早期 压缩: compress(压缩比很小): ...
- linux如何查看归档文件,linux基本命令:文本搜索,拷贝文件,移动文件,归档管理,压缩解压缩文件,查看命令位置...
1.文本搜索:grep grep查找的是文件内容中的文本,字符需要用引号括起来,单引双引都可以 格式:grep [-选项] '内容' 文件名 例如: -v显示不包含匹配文本的所有行(相当于求反) -n ...
- Linux压缩解压缩文章总结
Linux中zip压缩和unzip解压缩命令详解 这篇文章主要介绍了zip/unzip压缩解压缩命令的使用方法及参数的说明 1.把/home目录下面的mydata目录压缩为mydata.zip zip ...
- Linux运维:常用的压缩解压缩命令(zip、tar)
文章目录 压缩类型 zip类型 1.zip压缩 2.unzip解压缩 tar类型 1..tar压缩和解压 2..tar.gz压缩和解压 3..tar.bz2压缩和解压 4..tar.Z压缩和解压 5. ...
- Linux常用命令(第二版) --压缩解压缩命令
压缩解压缩命令: ----------.gz---------- 1.压缩 gzip[GNU zip]: /bin/gzip 格式: gzip 选项 [文件] #压缩文件,压缩后扩展名为.gz,Lin ...
- 详解Linux的压缩解压缩命令
1.性能稍差的两种压缩方式 gzip压缩 bzip2压缩 2.tar压缩 3.rar压缩 4.zip压缩 1. 性能稍差的两种压缩方式 1.1gzip压缩 1.gzip [ ...
- Linux压缩解压缩命令
2019独角兽企业重金招聘Python工程师标准>>> 压缩文件可以为磁盘节省不少空间,那么Linux系统的压缩和解压缩命令都有哪些呢?下面小编就给大家介绍下Linux压缩和解压缩的 ...
- tar压缩解压缩命令详解
tar压缩解压缩命令详解 tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个, ...
最新文章
- 进程初识和multiprocessing模块之Process
- Spring Boot 五种热部署方式,再也不用老重启了!
- Git从现有仓库新建干净版本(清除版本commit记录)
- Scala深入浅出实战初级入门经典视频课程
- vc red.msi matlab,vc red.msi x64+x32位版下载
- 网易数帆、云音乐、Intel、有赞最新大数据实践(PPT下载+视频回放)
- python读文件的方法open,file,with open
- java hl7v3_HL7标准V3开发框架中个模型的关系
- SLAM | 视觉SLAM中直接法开源算法:LSD-SLAM、DSO
- 考研要求过英语四六级!这些大学有明确规定!
- 中科大少年班,阿里云首席科学家闵万里离职,发内部信告别!
- asp.net core 日志中间件(LoggerMiddleware)
- 等价多米诺骨牌对的数量
- 奇门遁甲排盘方:定局
- 手机号码清洗的优势是什么
- python语音识别(语音转文字)
- android 儿童 汉字 学习 游戏,儿童学汉字游戏app
- 不会搭建Android知识框架,活该你成不了技术大牛!
- 奔图M9006DN复印机显示代码service error 191.10 engine error
- python井字棋_python实现井字棋小游戏