【问题标题】:istream and ostream across platforms跨平台的 istream 和 ostream
【发布时间】:2011-11-04 11:10:10
【问题描述】:

假设我想在我的大端机器上写这个

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örnPollex:是的,它们将由知道内部使用什么字节顺序的人正确初始化。我希望有像cout.setflags(std::big_endian) 这样简单的东西。
  • 所有实现都应该支持这一点,因为operator&lt;&lt; 的默认实现输出值的文本表示,operator&gt;&gt; 解析值的文本表示。流是否处于二进制模式无关紧要,非二进制模式只影响'\n'。
  • @dalle:确实——你是对的。我不应该在流插入方面编写接收器部分。这是我试图代表的一种网络协议,而接收者不在我的控制范围内。

标签: c++ portability iostream endianness


【解决方案1】:

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

【讨论】:

  • 看起来像我需要的 - 但是......我可以使用这个没有标签吗?换句话说:我可以将现有协议“逆向工程”成协议缓冲区消息吗?
【解决方案2】:

我不知道任何能够开箱即用的实现。自己编写此类内容的最简单方法可能是使用Boost.Iostreams。您可以简单地实现devices 以进行适当的转换,然后使用stream 创建一个流,该流代表您编写的设备并公开标准iostream 接口。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      相关资源
      最近更新 更多