С# 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());