boost::iostreams——谁叫你把0x0a转成0x0d 0x0a的混蛋东西

本文通过一个具体的例子介绍了Boost Iostreams库的应用,包括如何使用该库进行文本的压缩与解压缩,并分享了一个关于换行符处理的常见问题及解决方法。

先扯点背景知识:Boost Iostreams库是Boost库中一个流编程框架,它把字符流的处理泛化。使用者可以利用该库自行编写流过滤器(Filter)对流进行处理。

其实从学C++开始就一直对流这个概念感到费解,感觉太尼玛抽象了。但自从用了Iostreams这个库后,对流的认识开始深刻起来。说到流,现在我脑海里突然浮现出《疯狂动物城》中的一幕:一群交易员仓鼠排成一排,向狐狸购买冰棍。
这里写图片描述
萌出了一脸血啊!然而这个和我们的流有什么关系呢?这里我们的仓鼠队伍就可以看成一个流,你可以把仓鼠看成流中的元素,而我们的狐狸先生就是一个流处理器,对每个仓鼠都执行收钱,给冰棍的操作。

联系到实际运用中,比如我们经常要对一些文本进行压缩解压操作,其实就是对一个文本流中的字符进行重复的压缩解压操作。可能是来一个字符,进行一次处理,也有可能是来若干个字符,进行一次处理。你可以据此分别编写compressor和decompressor的filter。而用起来就更简单了,你只需要将这些filter排一排,然后让流经过就行,就像仓鼠们经过狐狸先生一样。

压缩过程的调用方式

#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/filtering_stream.hpp>

namespace io = boost::iostreams;

int main()
{   
    io::filtering_ostream out;
    out.push(compressor());
    out.push(base64_encoder());
    out.push(file_sink("my_file.txt"));
    // write to out using std::ostream interface
}

解压过程的调用方式

#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filtering_stream.hpp>

namespace io = boost::iostreams;

int main()
{   
    io::filtering_istream in;
    in.push(decompressor());
    in.push(base64_decoder());
    in.push(file_source("my_file.txt"));
    // read from in using std::istream interface
}

这里我不表如何编写filter,大家可以参看iostreams的user manual,写的还是挺详尽的。我想谈谈今天使用iostreams遇到的坑。

我要对某段文本进行RSA加密,RSA算法用的是之前就写好的库,应该不会有问题才对,结果运行时加完密的文件死活解密不了,这怎么可能呢?我反复比对了公私钥对,没有任何错误。同时又单独测了一次RSA算法,也没错,同样的明文加密完还是可以正常解密的。

不知道是不是福尔摩斯说的,排除了一切可能,即使最后一种假设多不可能,那也是真相。折腾了半天,实在没法了,我把程序中RSA加密生成密文和解密时用到的密文比对,居然不一致,差了一位!神奇!再看,是一个0x0a被写成了0x0d 0x0a!

顿时醒悟,这不是对换行符进行了转换吗?艹,谁干的?我生成的文件是binary的,我不要转换什么换行符!
网上查了查,呵呵,原来标准库fstream是会自作聪明地帮我们进行转换换行符,http://blog.sina.com.cn/s/blog_68281ec80100n4jt.html。这位仁兄给出了解决方案,我赶紧试了试

fos.push(FMFileEncryptFilter());
fos.push(file_sink(strFileName.toStdString(), std::ios_base::out | std::ios_base::binary));

没用!哭了!

我怀着万分悲痛的心情,寄希望于在user manual中寻求帮助,于是第一页我就看到了如下两句:

[1]Strictly speaking, it would be better to use a file_descriptor_sink instead of a file_sink here, because file_descriptor_sink never performs code conversion.

[2]Strictly speaking, it would be better to use a file_descriptor_source instead of a file_source here, because file_descriptor_source never performs code conversion.

我滴天,code conversion?难道这就是症结所在吗?赶紧换成如下:

fos.push(FMFileEncryptFilter());    fos.push(file_descriptor_sink(strFileName.toStdString()));

一试,好了!激动之情溢于言表,这个bug我调了快两天了!

虽然我知道没人看,但我还是要写一写,一点一点积累吧。

内容概要:本文围绕“组稀疏信号去噪”展开,深入研究了基于非凸正则化与凸优化的信号处理方法,并提供了完整的Matlab代码实现。文章系统阐述了如何通过引入非凸正则项克服传统稀疏恢复方法的局限性,从而在语音增强等实际应用中实现更优的去噪性能。研究采用组稀疏建模范式,将信号按子带或时频块进行分组,以更好地保留信号的结构性特征。文中详细构建了相应的数学模型,将原始优化问题转化为可通过凸优化技术求解的形式,并设计了高效的求解算法。通过全面的仿真实验,验证了该方法在提升信噪比和改善语音主观质量方面的显著优势,尤其在强噪声环境下表现出更强的鲁棒性。; 适合人群:具备一定信号处理理论基础和Matlab编程能力的研究生、科研人员,以及从事语音增强、音频处理、通信工程等相关领域的技术研发人员。; 使用场景及目标:①应用于语音通信系统、智能助听设备、语音识别前端预处理等对语音清晰度要求高的场景,有效提升嘈杂环境下的语音可懂度;②为科研工作者提供一个将非凸正则化理论与凸优化算法相结合的完整研究范例,促进先进信号恢复算法在实际工程系统中的转化与应用。; 阅读建议:建议读者结合提供的Matlab代码,深入剖析算法实现的核心步骤,重点关注目标函数的设计理念、非凸正则项的选取依据以及优化求解器的具体实现;同时,鼓励通过调整算法参数或在不同类型的噪声环境中进行测试,以探究算法的性能边界和鲁棒性特征。
内容概要:本文档聚焦于三电平ANPC并网逆变器的先进控制策略研究,重点阐述了一种融合DPWMA(离散脉宽调制)调制、正负序电流分离控制与电网电压前馈补偿的复合控制方法,并基于Simulink平台完成了系统建模与仿真验证。该方法旨在提升逆变器在电网电压不平衡等复杂工况下的动态响应性能与运行稳定性,特别针对低电压穿越(LVRT)能力进行了优化设计。研究内容还涵盖了中点电位平衡控制、虚拟同步发电机(VSG)技术以及构网型逆变器的双闭环控制架构,体现了对高阶电力电子变换系统深层次的建模与控制探索。文档同时罗列了大量相关的MATLAB/Simulink仿真实例,覆盖电力电子、新能源并网、优化算法、机器学习、路径规划等多个前沿科研领域,强调了科研工作中“借力”现有成果与追求“创新”突破的双重重要性。; 适合人群:从事电力电子与电力传动、新能源发电系统、微电网与智能电网控制等相关领域的研究生、科研人员及工程技术人员,要求具备扎实的电力系统基础知识、现代控制理论背景以及熟练的MATLAB/Simulink仿真操作能力。; 使用场景及目标:①深入研究三电平ANPC逆变器在不平衡电网条件下的高性能控制策略;②实现DPWMA调制技术与正负序电流独立控制的协同仿真与性能评估;③设计并验证融合电网前馈补偿与中点电位平衡的复合控制算法;④作为高级电力电子系统仿真与构网型控制技术的学习范本与项目开发参考。; 阅读建议:建议读者结合文档指引,通过指定公众号或网盘获取完整的仿真模型资源,在Simulink环境中动手复现核心控制模块,重点关注正负序分离算法、DPWMA调制波生成逻辑与前馈控制环节的实现细节,同时参考文末列出的多样化研究方向,以拓宽技术视野并激发创新思维。
内容概要:本文针对间歇性光伏出力条件下48V直流母线电压的稳定控制问题,构建了一个包含光伏阵列、Boost升压电路、储能电池、双向DC-DC变换器及负载的独立直流微网系统,并基于Simulink平台建立了完整的系统仿真模型。研究核心在于设计一套分层协同控制策略,实现光伏最大功率点跟踪(MPPT)与储能系统双向充放电的协调调控,以应对光照强度波动引起的功率不平衡挑战,保障直流母线电压的稳定。通过引入闭环反馈控制机制,优化系统能量管理流程,有效提升了离网运行工况下系统的动态响应速度与运行可靠性,为解决可再生能源供电系统中的电压波动问题提供了可行的技术路径。; 适合人群:电气工程、新能源科学与工程、自动化等相关专业的研究生及科研人员,以及具备电力电子技术、自动控制理论基础和Simulink仿真操作经验的工程技术人员。; 使用场景及目标:①用于离网型光伏直流微网系统的建模仿真与稳定性分析;②开展储能系统参与功率调节的协同控制策略研究;③支撑科研项目中的电压稳定控制算法设计与验证; 阅读建议:建议结合文中提到的Simulink仿真模型进行实操演练,重点关注MPPT控制与储能双向DC-DC协同调控环节的设计逻辑,配合参数调试加深对系统动态特性的理解,同时可参考同类研究拓展多目标优化与鲁棒性提升方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值