对于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);
}
}
答案 0 :(得分:2)
由于这些都是基于字符的API,因此它们的解释取决于所使用的 encoding 。而且由于两个Little-endian and Big-endian UTF16 encodings均受支持,因此您的问题没有一个答案。
(请注意,如果您想始终能够成功读取二进制数据,首先必须清楚地知道使用哪种编码来创建二进制数据)