C# BinaryWriter - 和字节顺序
C# BinaryWriter - and endianness
我在我的代码中使用 BinaryWriter,这是我的代码:
static void Main(string[] args)
{
FileInfo file = new FileInfo(@"F:\testfile");
if (file.Exists) file.Delete();
using (BinaryWriter bw = new BinaryWriter(file.Create()))
{
ushort a = 1024;
ushort b = 2048;
bw.Write(a);
bw.Write(b);
bw.Write(a);
bw.Write(b);
}
Console.ReadLine();
}
但是输出文件的十六进制是:
那不是0x0004 = 4吗?为什么?
虽然 1024 是 0x0400
。在将其存储在文件或内存中时,
问题来了,我们应该使用小端还是大端表示法?
如果是BinaryWriter
,则为小端。这意味着 LSB 先行 - 然后是 MSB。
因此,它存储为:
LSB | MSB
00 04
您可以阅读有关字节顺序的更多信息。
如果我没记错的话,在显示中输出的字节顺序与您的期望相反。尽管 1024
的十六进制表示形式是 0400
,但它可能存储为 0004
,具体取决于编码或平台的字节顺序。
作为旁注,它写入文件完全,因为它在msdn:
中指定
Remarks
BinaryWriter stores this data type in little endian format.
您要求的是“大端格式”。您必须重新实现 BinaryWriter
才能做到这一点。
请注意 BinaryWriter
与 BitConverter
的行为不同。 BinaryWriter
是“总是小端”,而 BitConverter.GetBytes(ushort)
(这是一个完全不同的函数,但有一个“共同”连接:将数字转换为字节)是“本地端”(所以它使用计算机的字节序)
Note
The order of bytes in the array returned by the GetBytes method depends on whether the computer architecture is little-endian or big-endian.
最后,在 Intel/AMD 个人电脑上,这种差异没有实际意义:英特尔是小端法,几乎所有手机也是如此。据我所知,唯一支持 .NET(特殊版本)的大例外是 Xbox360。
我在我的代码中使用 BinaryWriter,这是我的代码:
static void Main(string[] args)
{
FileInfo file = new FileInfo(@"F:\testfile");
if (file.Exists) file.Delete();
using (BinaryWriter bw = new BinaryWriter(file.Create()))
{
ushort a = 1024;
ushort b = 2048;
bw.Write(a);
bw.Write(b);
bw.Write(a);
bw.Write(b);
}
Console.ReadLine();
}
但是输出文件的十六进制是:
那不是0x0004 = 4吗?为什么?
虽然 1024 是 0x0400
。在将其存储在文件或内存中时,
问题来了,我们应该使用小端还是大端表示法?
如果是BinaryWriter
,则为小端。这意味着 LSB 先行 - 然后是 MSB。
因此,它存储为:
LSB | MSB
00 04
您可以阅读有关字节顺序的更多信息。
如果我没记错的话,在显示中输出的字节顺序与您的期望相反。尽管 1024
的十六进制表示形式是 0400
,但它可能存储为 0004
,具体取决于编码或平台的字节顺序。
作为旁注,它写入文件完全,因为它在msdn:
中指定Remarks
BinaryWriter stores this data type in little endian format.
您要求的是“大端格式”。您必须重新实现 BinaryWriter
才能做到这一点。
请注意 BinaryWriter
与 BitConverter
的行为不同。 BinaryWriter
是“总是小端”,而 BitConverter.GetBytes(ushort)
(这是一个完全不同的函数,但有一个“共同”连接:将数字转换为字节)是“本地端”(所以它使用计算机的字节序)
Note
The order of bytes in the array returned by the GetBytes method depends on whether the computer architecture is little-endian or big-endian.
最后,在 Intel/AMD 个人电脑上,这种差异没有实际意义:英特尔是小端法,几乎所有手机也是如此。据我所知,唯一支持 .NET(特殊版本)的大例外是 Xbox360。