字节顺序(Endianness):
小端序(Little-endian):低字节在前(如 F4 06 0B 00)。
转换时需要按小端序解析:0x00 是最高位,0xF4 是最低位。
例如,一个16位的整数0x1234(两个字节,0x12是高位,0x34是低位):
- 大端序:内存低地址 -> 0x12, 内存高地址 -> 0x34
- 小端序:内存低地址 -> 0x34, 内存高地址 -> 0x12
网络协议通常采用大端序(网络字节序),而不同的主机可能采用不同的字节序(主机字节序)。因此,在将数据发送到网络之前,需要将主机字节序转换为网络字节序(如果主机字节序是小端序,则需要进行转换;如果是大端序,则不需要转换,但为了通用性,我们仍然进行转换操作)。
.NET框架提供了IPAddress.HostToNetworkOrder方法,用于将主机字节序转换为网络字节序。
Windows 系统默认是小端序:
所有基于 x86/x64 架构的 Windows 系统(包括 Windows 10/11 和 Windows Server)都是小端序
ARM 架构的 Windows 设备(如 Surface Pro X)也使用小端序
所以在 Windows 上运行 C# 程序,BitConverter.IsLittleEndian 几乎总是返回 true
// 接收到的 UDP 数据(小端序格式)
byte[] receivedData = udpClient.Receive(ref remoteEP);
// 方法1:使用 BinaryPrimitives(.NET Core 3.0+ 推荐)
uint value = BinaryPrimitives.ReadUInt32LittleEndian(receivedData.AsSpan(0, 4));
// 方法2:移位操作(兼容所有 .NET 版本)
uint value = (uint)(
receivedData[0] |
(receivedData[1] << 8) |
(receivedData[2] << 16) |
(receivedData[3] << 24)
);
// 方法3:使用 BitConverter(需要确认系统字节序)
if (!BitConverter.IsLittleEndian)
{
Array.Reverse(receivedData, 0, 4); // 需要反转字节序
}
uint value = BitConverter.ToUInt32(receivedData, 0);