猿问

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

对于BinaryReader.ReadInt32()和BinaryReader.ReadSingle()净的文件说:


BinaryReader 以小端格式读取此数据类型。


所以我推断 BinaryReader 会以小端格式读取这些数据类型,即使我的计算机架构(由 验证BitConverter.isLittleEndian)是基于大端格式的。


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


现在我不确定这些方法是否根据计算机体系结构来解释字节,或者它们是否也基于小端。特别是我对BinaryReader.PeekChar()返回相同的数据类型如BinaryReader.ReadInt32(). 因此,此方法也以小端格式读取字节是有意义的。


想象一下这种情况:我的应用程序运行在基于大端的计算机体系结构上,并尝试读取基于大端的二进制文件。在这种情况下,我将不得不逆转字节顺序BinaryReader.ReadInt32()和BinaryReader.ReadSingle()(见下文代码)。但是我必须为BinaryReader.PeekChar()and做同样的事情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);

    }

}


jeck猫
浏览 265回答 1
1回答

慕容森

由于这些是基于字符的 API,它们的解释取决于所使用的编码。由于支持Little-endian 和 Big-endian UTF16 编码,因此您的问题没有唯一的答案。(和注释,这是必要的,你清楚地知道使用的编码摆在首位,以创建二进制数据,如果你希望能够成功读取也无妨)
随时随地看视频慕课网APP
我要回答