因此,我使用BitConverter.GetBytes()将uint32转换为byte [],但是我的数组中的顺序似乎倒退了。 http://msdn.microsoft.com/en-us/library/1184xdy4.aspx (显示它的字节[]似乎是小端)。C# - 将uint转换为byte []
是否有更好的方法来处理这个问题,而不是仅仅使用linq来反转字节数组?
因此,我使用BitConverter.GetBytes()将uint32转换为byte [],但是我的数组中的顺序似乎倒退了。 http://msdn.microsoft.com/en-us/library/1184xdy4.aspx (显示它的字节[]似乎是小端)。C# - 将uint转换为byte []
是否有更好的方法来处理这个问题,而不是仅仅使用linq来反转字节数组?
所以我想通了,我困惑的很大一部分是与此有关:IsLittleEndian field reports false, but it must be Little-Endian?
我最终什么事做在包装的所有BitConverter与调用了一个额外的参数specifiy字节序,然后调用添加了一个被调用来检查字节是否需要被尊重的函数。
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();
}
}
Array.Reverse
改变字节。
Microsoft在BitConverter的文档页面上讨论了GetBytes()方法的小端/大端问题。
如果您打算在平台体系结构之间移动,只需在一个平台上倒置阵列即可,但在已使用大端平台的平台上会失败。
您使用IPAddress.HostToNetworkOrder函数,这将确保数据始终处于网络顺序(大端)。
uint number = 234234233;
uint bigEndian = IPAddress.HostToNetworkOrder(number);
byte[] b = BitConverter.GetBytes(bigEndian);
以下是一种总是快速获取大端字节数组的方法。
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);
}
此重载才能得心应手,虽然护理必须通过机器不同尾数nesses工作时服用。
public static byte[] GetBigEndianBytes(UInt32 val)
{
return GetBigEndianBytes(val, BitConverter.IsLittleEndian);
}
我想这就是我很困惑,虽然BitConverter.IsLittleEndian返回false,但BitConverter.GetBytes()返回小端数组。 – 2010-08-03 17:07:02
如果这是Windows,返回false的BitConverter.IsLittleEndian显然是一个错误,因为x86和x86-64处理器是Little Endian。 – Powerlord 2010-08-05 15:16:35