所以我使用BitConverter.GetBytes()将uint32转换为byte [],但我的数组中的顺序似乎是倒退的. http://msdn.microsoft.com/en-us/library/1184xdy4.aspx (显示它的byte []似乎是小端).
有没有更好的方法来处理这个而不仅仅是使用linq来反转字节数组?
如果要在平台体系结构之间切换,则仅在一个平台上反转阵列可能是正确的,但在已经使用大端字节序的平台上失败。
您使用IPAddress.HostToNetworkOrder函数,这将确保数据始终按网络顺序排列(大端)。
uint number = 234234233;
uint bigEndian = (uint)IPAddress.HostToNetworkOrder((int)number);
byte[] b = BitConverter.GetBytes(bigEndian);
Run Code Online (Sandbox Code Playgroud)
所以我发现我的困惑很大一部分与此有关:IsLittleEndian 字段报告错误,但它必须是 Little-Endian?
我最终所做的是将所有 BitConverter 调用包装为带有额外参数来指定字节顺序的调用,然后添加一个被调用的函数来检查是否需要尊重字节。
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26992 次 |
| 最近记录: |