Вопрос

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

Это было полезно?

Решение

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

BitConverter.GetBytes(5)

производит

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

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

Другие советы

Я написал следующие классы обертки, чтобы справиться с случаем BitConverter Ожидая маленького эндиена.

    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);
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top