BinaryReader 是否以小端格式读取所有数据类型?

Does BinaryReader read all data types in little-endian format?

对于 BinaryReader.ReadInt32() and BinaryReader.ReadSingle() .Net 的文档说:

BinaryReader reads this data type in little-endian format.

所以我认为 BinaryReader 将以小端格式读取此数据类型,即使我的计算机体系结构(由 BitConverter.isLittleEndian 验证)基于大端格式也是如此。

但是对于BinaryReader.ReadChars() (returning Char[]) and BinaryReader.PeekChar()(返回Int32)没有关于字节顺序的注释。

现在我不确定这些方法是否根据计算机体系结构解释字节,或者它们是否也基于小端。特别是我对 BinaryReader.PeekChar() 和 returns 与 BinaryReader.ReadInt32() 相同的数据类型感到困惑。因此,此方法还以小端格式读取字节是有道理的。

想象一下这种情况:我的应用程序 运行 在基于大端的计算机体系结构上,并尝试读取基于大端的二进制文件。在这种情况下,我将不得不颠倒 BinaryReader.ReadInt32()BinaryReader.ReadSingle() 的字节顺序(参见下面的代码)。但是我必须对 BinaryReader.PeekChar()BinaryReader.ReadChars() 做同样的事情吗?不幸的是,我没有基于大端的计算机/操作系统。但是我的应用应该兼容这个架构。

public class ReverseBinaryReader: BinaryReader
{
    public ReverseBinaryReader(Stream stream, Encoding encoding) : base(stream, encoding) { }

    public override int ReadInt32()
    {
        var data = base.ReadBytes(4);
        Array.Reverse(data);
        return BitConverter.ToInt32(data, 0);
    }

    public override float ReadSingle()
    {
        var data = base.ReadBytes(4);
        Array.Reverse(data);
        return BitConverter.ToSingle(data, 0);
    }
}

由于这些是基于字符的 API,它们的解释取决于所使用的 编码。由于 Little-endian and Big-endian UTF16 encodings 均受支持,因此您的问题没有单一的答案。

(请注意,有必要 如果您希望能够成功读取二进制数据,那么您首先要清楚地知道使用什么编码来创建二进制数据)