我使用BitConverter.GetBytes()将uint32转换为byte[],但是数组中的顺序似乎是相反的。 http://msdn.microsoft.com/en-us/library/1184xdy4.aspx (显示其字节数组似乎是小端)。
除了使用 LINQ 反转字节数组外,是否有更好的处理方式?
我使用BitConverter.GetBytes()将uint32转换为byte[],但是数组中的顺序似乎是相反的。 http://msdn.microsoft.com/en-us/library/1184xdy4.aspx (显示其字节数组似乎是小端)。
除了使用 LINQ 反转字节数组外,是否有更好的处理方式?
Array.Reverse
可以改变字节序。
uint number = 234234233;
uint bigEndian = (uint)IPAddress.HostToNetworkOrder((int)number);
byte[] b = BitConverter.GetBytes(bigEndian);
public static class BitEndianConverter
{
public static byte[] GetBytes(bool value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
public static byte[] GetBytes(char value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
public static byte[] GetBytes(double value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
public static byte[] GetBytes(float value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
public static byte[] GetBytes(int value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
public static byte[] GetBytes(long value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
public static byte[] GetBytes(short value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
public static byte[] GetBytes(uint value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
public static byte[] GetBytes(ulong value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
public static byte[] GetBytes(ushort value, bool littleEndian)
{
return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
}
private static byte[] ReverseAsNeeded(byte[] bytes, bool wantsLittleEndian)
{
if (wantsLittleEndian == BitConverter.IsLittleEndian)
return bytes;
else
return (byte[])bytes.Reverse().ToArray();
}
}
public static byte[] GetBigEndianBytes(UInt32 val, bool isLittleEndian)
{
UInt32 bigEndian = val;
if (isLittleEndian)
{
bigEndian = (val & 0x000000FFU) << 24 | (val & 0x0000FF00U) << 8 |
(val & 0x00FF0000U) >> 8 | (val & 0xFF000000U) >> 24;
}
return BitConverter.GetBytes(bigEndian);
}
这种重载可能很方便,但在使用不同字节序的机器时必须小心。
public static byte[] GetBigEndianBytes(UInt32 val)
{
return GetBigEndianBytes(val, BitConverter.IsLittleEndian);
}