跨平台的 istream 和 ostream

4
假设我想在我的大端机器上写这个代码
an_ostream_impl my_output_on_BE;
my_output_on_BE << __int32(0x1234);

在我的小端机器上,会出现这种情况。
an_istream_impl my_input_on_LE;  

__int32 value;
my_input_on_LE >> value;
assert( value == 0x1234 );

有没有实现这一功能的istream / ostream? 例如始终以Big Endian(或任何格式)流传输数字?

我假设你正在使用二进制模式的流? - Björn Pollex
@BjörnPollex:是的,它们需要由了解内部字节顺序的人正确初始化。我希望有一个像cout.setflags(std::big_endian)这样简单的东西。 - xtofl
1
所有的实现都应该支持这个默认实现,operator<<会输出值的文本表示,operator>>会解析值的文本表示。流是二进制模式还是非二进制模式并不重要,非二进制模式只会影响到 '\n'。 - dalle
@dalle:确实 - 你是对的。我不应该用流插入来编写接收器部分。我试图表示的是一个网络协议,而接收器不在我的控制范围之内。 - xtofl
3个回答

2
如果你需要在机器之间共享比单个整数更复杂的数据,我强烈推荐使用Google Protocol Buffers。你可以在文本文件中定义“消息”,通过编译器(protoc)运行它们,并获得你选择的语言源代码。这个源代码定义了与你的消息规范相对应的对象,以及序列化和反序列化方法。

看起来像我需要的 - 但是...我能在没有标签的情况下使用它吗?换句话说:我能将现有协议“逆向工程”成一个Protocol Buffer消息吗? - xtofl

1

我不知道有任何一种能够立即实现这个功能的方法。最简单的方式可能是使用Boost.Iostreams自己编写类似的程序。你可以简单地为适当的转换实现设备,然后使用stream创建一个代理到你编写的设备并暴露标准iostream接口的流。


0
在这种情况下,可能唯一的方法是自己进行序列化/反序列化,即逐字节读取/写入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接