C # Big-endian ulong из 4 байтов - PullRequest
13 голосов
/ 21 июля 2010

Я пытаюсь привести 4-байтовый массив к ulong в C #.В настоящее время я использую этот код:

atomSize = BitConverter.ToUInt32(buffer, 0);

Байт [4] содержит это:

0 0 0 32

Однако, байты являются байтовыми.Есть ли простой способ преобразовать этот ульгионец с прямым порядком байтов в ульгиан с прямым порядком байтов?

Ответы [ 7 ]

19 голосов
/ 21 июля 2010

Я полагаю, что EndianBitConverter в библиотеке 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);
7 голосов
/ 21 июля 2010

System.Net.IPAddress.NetworkToHostOrder(atomSize); перевернет ваши байты.

5 голосов
/ 21 июля 2010

Я рекомендую использовать Моно DataConvert, что похоже на BitConverter на стероидах. Это позволяет вам напрямую читать байтовые массивы с прямым порядком байтов и значительно улучшает BitConverter.

Прямая ссылка на источник здесь .

4 голосов
/ 18 августа 2012
BitConverter.ToUInt32(buffer.Reverse().ToArray(), 0)

Нет?

2 голосов
/ 06 марта 2015

Это может быть старым, но я удивлен, что никто не придумал этот самый простой ответ, требуется только одна строка ...

// buffer is 00 00 00 32
Array.Reverse(buffer);
// buffer is 32 00 00 00
atomSize = BitConverter.ToUInt32(buffer, 0);

Я использую его для сравнения контрольных сумм, сгенерированных в C # (little-endian), с контрольными суммами, сгенерированными в Java (big-endian).

1 голос
/ 05 апреля 2019

В ядре .net (> = 2.1) вы можете использовать это вместо:

BinaryPrimitives.ReadUInt32BigEndian(buffer);

Таким образом, вы уверены, что вы читаете порядковый номер.

https://apisof.net/catalog/System.Buffers.Binary.BinaryPrimitives.ReadUInt32BigEndian(ReadOnlySpan%3CByte%3E)

Это реализовано там, если вам интересно, как это работает: https://github.com/dotnet/coreclr/blob/de68c9ddd18f863fd67098ab28d19206c9c66627/src/System.Private.CoreLib/shared/System/Buffers/Binary/ReaderBigEndian.cs#L75

0 голосов
/ 21 июня 2012
firstSingle = BitConverter.ToSingle(buffer,0);
secondSingle = BitConverter.ToSingle(buffer,2); 

var result = BitConverter.ToUInt32(BitConverter.GetBytes(secondSingle).Concat(BitConverter.GetBytes(firstSingle).ToArray());
...