【问题标题】:Is .NET BinaryReader always little-endian, even on big-endian systems?.NET BinaryReader 是否总是小端,即使在大端系统上也是如此?
【发布时间】:2012-03-08 22:05:11
【问题描述】:

Microsoft 有关用于 ReadUnt32 的 BinaryReader 的文档(例如)指出:使用 little-endian 编码从当前流中读取 4 字节无符号整数。然而,这是否总是正确的,即使在大端系统上也是如此?

【问题讨论】:

  • 嗯,Windows only runs on little-endian machines 和 Microsoft 的 .NET 框架也是如此。 Mono 可能是另一回事。
  • @Christian.K:错了。 Xbox 360 是大端。
  • @Jason 哇,看来我在这里太“专注”了(不是说思想狭隘)。谢谢。
  • 几乎没有理由认为 MSDN 文章是错误的。不是。

标签: .net


【解决方案1】:

文档肯定暗示其他平台上的实现者应该使用小端编码,Mono seems to respect this:

public virtual uint ReadUInt32() {
FillBuffer(4);

return((uint) (m_buffer[0] |
           (m_buffer[1] << 8) |
           (m_buffer[2] << 16) |
           (m_buffer[3] << 24)));
}

【讨论】:

    【解决方案2】:

    直接来自documentationBinaryReader.ReadUInt32

    BinaryReader 以 little-endian 格式读取此数据类型。

    请注意,机器的底层字节序没有限定条件。底层系统是否为大端(比如 Xbox 360)无关紧要,BinaryReader 将以小端读取。

    事实上,如果你拆开源码你会看到:

    public virtual long ReadInt64() {
        this.FillBuffer(4);
        uint num = (uint) (((this.m_buffer[0] |
                  (this.m_buffer[1] << 0x08)) |
                  (this.m_buffer[2] << 0x10)) |
                  (this.m_buffer[3] << 0x18));
        return num;
    }
    

    显示非常清楚它会忽略字节顺序。

    现在,从小端到大端的机器变化的是BitConverter.ToUInt32。输出将尊重机器的底层字节序。

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 2011-02-06
      • 1970-01-01
      • 2012-03-03
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多