Проблемы с C # BitConverter - PullRequest
       14

Проблемы с C # BitConverter

2 голосов
/ 03 декабря 2011

Обычно, если вы хотите, например, представить 5 в байтовом массиве, это будет что-то вроде {0x00,0x00,0x00,0x05}, но BitConverter дает мне обратный массив ({0x05,0x00,0x00,0x00}) Почему это так и где я не прав?

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011

Скорее всего, вы находитесь на архитектуре с прямым порядком байтов (что имеет место для обычных архитектур x86 и x86-64).Вы можете проверить это с помощью свойства BitConverter.IsLittleEndian.В такой архитектуре на первом месте стоит наименьший значимый байт , что объясняет, почему

BitConverter.GetBytes(5)

производит

{ 0x05, 0x00, 0x00, 0x00 }

Конечно, вы можетепри необходимости измените массив на основе порядка байтов системы / цели.Вы можете найти EndianBitConverter в списке здесь .

0 голосов
/ 23 ноября 2017

Я написал следующие классы-обертки для обработки случая BitConverter, ожидающего Little Endien.

    public static Int16 ToInt16(byte[] data, int offset)
    {
        if (BitConverter.IsLittleEndian)
        {
            return BitConverter.ToInt16(BitConverter.IsLittleEndian ? data.Skip(offset).Take(2).Reverse().ToArray() : data, 0);
        }
        return BitConverter.ToInt16(data, offset);
    }

    public static Int32 ToInt32(byte[] data, int offset)
    {
        if (BitConverter.IsLittleEndian)
        {
            return BitConverter.ToInt32(BitConverter.IsLittleEndian ? data.Skip(offset).Take(4).Reverse().ToArray() : data, 0);
        }
        return BitConverter.ToInt32(data, offset);
    }

    public static Int64 ToInt64(byte[] data, int offset)
    {
        if (BitConverter.IsLittleEndian)
        {
            return BitConverter.ToInt64(BitConverter.IsLittleEndian ? data.Skip(offset).Take(8).Reverse().ToArray() : data, 0);
        }
        return BitConverter.ToInt64(data, offset);
    }
...