С# Big-endian ulong от 4 байт
Я пытаюсь создать массив из 4 байтов в ulong в С#. В настоящее время я использую этот код:
atomSize = BitConverter.ToUInt32(buffer, 0);
Байт [4] содержит следующее:
0 0 0 32
Однако байты - Big-Endian. Есть ли простой способ преобразовать этот большой-длинный юнгуд в маленький-Endian ulong?
Ответы
Ответ 1
Я считаю, что EndianBitConverter в Jon Skeet MiscUtil библиотека (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);
Ответ 2
System.Net.IPAddress.NetworkToHostOrder(atomSize);
будет переворачивать ваши байты.
Ответ 3
Я рекомендую использовать Mono DataConvert
, который похож на BitConverter
на стероиды. Это позволяет вам напрямую считывать массивы байтов байтов и улучшать массивы на BitConverter
.
Прямая ссылка на источник здесь.
Ответ 4
BitConverter.ToUInt32(buffer.Reverse().ToArray(), 0)
Нет
Ответ 5
Это может быть старым, но я удивлен, что никто не придумал этот самый простой ответ, требуется только одна строка...
// buffer is 00 00 00 32
Array.Reverse(buffer);
// buffer is 32 00 00 00
atomSize = BitConverter.ToUInt32(buffer, 0);
Я использую его для сравнения контрольных сумм, сгенерированных в С# (little-endian) с контрольными суммами, сгенерированными в Java (big-endian).
Ответ 6
firstSingle = BitConverter.ToSingle(buffer,0);
secondSingle = BitConverter.ToSingle(buffer,2);
var result = BitConverter.ToUInt32(BitConverter.GetBytes(secondSingle).Concat(BitConverter.GetBytes(firstSingle).ToArray());