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

tgi*_*hil 5 .net

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

Joe*_*Joe 7

该文档肯定暗示其他平台上的实现者应该使用little-endian编码,Mono似乎尊重这一点:

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

return((uint) (m_buffer[0] |
           (m_buffer[1] << 8) |
           (m_buffer[2] << 16) |
           (m_buffer[3] << 24)));
}
Run Code Online (Sandbox Code Playgroud)


jas*_*son 5

直接从文档BinaryReader.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;
}
Run Code Online (Sandbox Code Playgroud)

显而易见它忽略了字节序.

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