【问题标题】:Does BitConverter handle little-endianness incorrectly?BitConverter 是否错误地处理小端?
【发布时间】:2021-07-11 13:36:46
【问题描述】:

我目前正在用 C#/.NET 编写一些涉及在网络数据包中发送无符号 16 位整数的内容。字节的顺序需要大端。

在位级别,我对“大端”的理解是,最重要的位在最后,而小端则相反。

在字节级别,我的理解是一样的——如果我将一个 16 位整数转换为组成它的两个 8 位整数,并且架构是小端序,那么我希望最重要的 byte 放在开头。

但是,BitConverter 似乎将具有最小值的字节放在数组的末尾,而不是具有最低有效值的字节,例如

    ushort number = 4;
    var bytes = BitConverter.GetBytes(number);
    Debug.Assert(bytes[BitConverter.IsLittleEndian ? 0 : 1] == 0);

为了清楚起见,如果我的理解是正确的,那么在小端机器上我希望上面返回0x00, 0x04,在大端机器上返回0x04, 0x00。然而,在我运行 .NET 5 的小端 Windows x86 工作站上,它返回 0x04, 0x00

甚至有记录表明他们已经考虑了字节序。来自:https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter.getbytes?view=net-5.0

GetBytes 方法返回的数组中的字节顺序取决于计算机体系结构是小端还是大端。

我是傻还是这看起来是错误的行为?

【问题讨论】:

    标签: c# .net bitconverter


    【解决方案1】:

    我确实很愚蠢。正如@mjwills 所指出的,微软的文档解释了(https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter.islittleendian?view=net-5.0#remarks):

    “Big-endian”表示最高有效字节位于单词的左端。 “Little-endian”表示最高有效字节位于单词的右端。

    维基百科有更好的解释:

    大端系统将字的最高有效字节存储在最小的内存地址,而最低有效字节存储在最大的内存地址。相比之下,little-endian 系统将最低有效字节存储在最小地址。

    所以,如果你想象一下内存地址,将一个值为 4 的 16 位整数转换为:

    Address 0x00 0x01
    Little-endian 0x04 0x00
    Big-endian 0x00 0x04

    希望这能帮助将来同样愚蠢的人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多