我想从用户的角度提供std::ostream
可能会或可能不会加密其内容。
想象一下使用std::ostream&
的一些随机函数:
void write_stuff( std::ostream& stream ) {
os << "stuff";
}
stuff
是以明文形式输出还是加密取决于stream
参数的初始化方式。
我正在考虑从std::basic_streambuf
继承,但我不确定这是最好的方法。我认为理想的场景是在实际输出内容之前运行的某种过滤器对象。这样就可以很容易地进行连锁操作,例如加密然后进行十六进制编码,这使我自己的basic_streambuf
似乎没有给出(至少不容易)。
有任何建议吗?
感谢。
更新:我遵循了接受的答案所规定的策略。我发现这篇关于写custom streambuf
which performs XOR obfuscation的文章作为一个起点非常有用。
答案 0 :(得分:4)
streambuf
可以用另一个任意streambuf
来实现,它可以作为参数传递给构造函数,也可以使用特殊的成员函数进行设置。这样就可以像你想象的那样堆叠streambuf
个实现。
您甚至可以制作一个使用ostream
的{{1}}函数来获取当前rdbuf
的操纵者,在streambuf
上调用设置'堆叠'的函数“streambuf
,然后再次致电streambuf
,将rdbuf
的{{1}}替换为您自己的ostream
。
streambuf
答案 1 :(得分:2)
很难简单地描述为新源或接收器创建I/O stream所需要做的事情。幸运的是,Jonathan Turkanis和CodeRage, LLC创建了非常好的构建块,具有出色的文档,可以帮助您节省数百小时的新流的研究和开发。该库名为Boost.Iostreams。
文档中的second example确切地说明了如何解决您的问题。
另外,请注意他们已经有一个带zip压缩的输出流。所以也许你甚至不需要编写一行代码。
祝你好运!答案 2 :(得分:0)
我不确定我要提出的建议正是你所需要的(而且它太复杂而无法发表评论),但你有没有听说过操纵者?< / p>
#include <iostream>
#include <iomanip>
int main(int, char**)
{
int a = 10;
std::cout << "a: " << a << std::endl; //outputs: "a: 10"
std::cout << "a: " << std::hex << a << std::endl; //outputs: "a: a"
std::cout << "a: " << std::dec << a << std::endl; //outputs: "a: 10"
return EXIT_SUCCESS;
}
您可能确实使用了类似的模式(这与您实际称为“过滤器”对象的模式匹配)以某种方式更改自定义流对象的状态。