即使在big-endian系统上,.NET BinaryReader是否仍然是小端的?

时间:2012-03-08 13:47:02

标签: .net

用于ReadUnt32的BinaryReader的Microsoft文档(例如)声明:使用little-endian编码从当前流中读取4字节无符号整数。但是,即使在大端系统上,这总是正确的吗?

2 个答案:

答案 0 :(得分:7)

文档肯定暗示其他平台上的实现者应该使用little-endian编码,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)));
}

答案 1 :(得分:5)

直接来自BinaryReader.ReadUInt32的{​​{3}}:

  

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。输出将尊重机器的底层字节序。