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 均受支持,因此您的问题没有单一的答案。
(请注意,有必要 如果您希望能够成功读取二进制数据,那么您首先要清楚地知道使用什么编码来创建二进制数据)
对于 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 均受支持,因此您的问题没有单一的答案。
(请注意,有必要 如果您希望能够成功读取二进制数据,那么您首先要清楚地知道使用什么编码来创建二进制数据)