我正在尝试在C#中将一个4字节数组转换为ulong类型。我目前正在使用以下代码:
atomSize = BitConverter.ToUInt32(buffer, 0);
这个byte[4]包含了以下内容:
0 0 0 32
然而,这些bytes采用的是Big-Endian顺序。有没有一种简单的方法将这个Big-Endian的ulong转换成Little-Endian的ulong?
我正在尝试在C#中将一个4字节数组转换为ulong类型。我目前正在使用以下代码:
atomSize = BitConverter.ToUInt32(buffer, 0);
这个byte[4]包含了以下内容:
0 0 0 32
然而,这些bytes采用的是Big-Endian顺序。有没有一种简单的方法将这个Big-Endian的ulong转换成Little-Endian的ulong?
我认为Jon Skeet的MiscUtil库中的EndianBitConverter(nuget link)可以实现你想要的功能。
你也可以使用位移操作来交换位:
uint swapEndianness(uint x)
{
return ((x & 0x000000ff) << 24) + // First byte
((x & 0x0000ff00) << 8) + // Second byte
((x & 0x00ff0000) >> 8) + // Third byte
((x & 0xff000000) >> 24); // Fourth byte
}
使用方法:
atomSize = BitConverter.ToUInt32(buffer, 0);
atomSize = swapEndianness(atomSize);
Array.Reverse()
),也不需要额外的分配(buffer.Reverse().ToArray()
)。 - Good Night Nerd PrideSystem.Memory
nuget 包。 - smkanadlSystem.Net.IPAddress.NetworkToHostOrder(atomSize);
会翻转你的字节。
BitConverter.ToUInt32(buffer.Reverse().ToArray(), 0)
ToArray()
调用。 - Jeff Mercado这可能有点老了,但我很惊讶还没有人提出这个最简单的答案,只需要一行代码...
// buffer is 00 00 00 32
Array.Reverse(buffer);
// buffer is 32 00 00 00
atomSize = BitConverter.ToUInt32(buffer, 0);
我正在使用它来比较在C#(小端)生成的校验和和在Java(大端)生成的校验和。
firstSingle = BitConverter.ToSingle(buffer,0);
secondSingle = BitConverter.ToSingle(buffer,2);
var result = BitConverter.ToUInt32(BitConverter.GetBytes(secondSingle).Concat(BitConverter.GetBytes(firstSingle).ToArray());