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

时间:2018-07-16 13:47:02

标签: c# .net endianness binaryreader

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

  

BinaryReader以小字节序格式读取此数据类型。

因此,即使我的计算机体系结构(由BitConverter.isLittleEndian验证)是基于big-endian格式的,我也认为BinaryReader将以little-endian格式读取此数据类型。 >

但是对于BinaryReader.ReadChars()(返回Char [])和BinaryReader.PeekChar()(返回Int32),没有关于字节顺序的说明。

现在,我不确定这些方法是否根据计算机体系结构解释字节,还是也基于小端格式。尤其让我感到困惑的是,BinaryReader.PeekChar()返回的数据类型与BinaryReader.ReadInt32()类似。因此,该方法还读取Little-endian格式的字节是很有意义的。

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

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);
    }
}

1 个答案:

答案 0 :(得分:2)

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

(请注意,如果您想始终能够成功读取二进制数据,首先必须清楚地知道使用哪种编码来创建二进制数据)