C# - Преобразование uint к байту []

Таким образом, я использовал BitConverter. GetBytes () для преобразования uint32 в байт [] но мой порядок в массиве, кажется, назад. http://msdn.microsoft.com/en-us/library/1184xdy4.aspx (показывает, что это - байт [], кажется, прямой порядок байтов).

Существует ли лучший дорожный дескриптор это, чем просто использование linq для инвертирования массивов байтов?

11
задан Joel Barsotti 3 August 2010 в 05:06
поделиться

4 ответа

Итак, я понял, что большая часть моей путаницы связана с этим: Поле IsLittleEndian сообщает ложь, но это должно быть мало -Endian?

В итоге я обернул все вызовы BitConverter вызовом, который принял дополнительный параметр для указания порядка байтов, а затем добавил функцию, которая вызывается для проверки, нужно ли учитывать байты.

public static class BitEndianConverter
{
    public static byte[] GetBytes(bool value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }

    public static byte[] GetBytes(char value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(double value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(float value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(int value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(long value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(short value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(uint value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(ulong value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }
    public static byte[] GetBytes(ushort value, bool littleEndian)
    {
        return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian);
    }

    private static byte[] ReverseAsNeeded(byte[] bytes, bool wantsLittleEndian)
    {
        if (wantsLittleEndian == BitConverter.IsLittleEndian)
            return bytes;
        else
            return (byte[])bytes.Reverse().ToArray();
    }
}
2
ответ дан 3 December 2019 в 07:10
поделиться

Microsoft обсуждает проблему прямого / обратного порядка байтов с методом GetBytes () на странице документации для BitConverter .

4
ответ дан 3 December 2019 в 07:10
поделиться

Если вы собираетесь перемещаться между архитектурами платформы, простое реверсирование массива может быть правильным на одной платформе, но не удастся на платформе, которая уже использует прямой порядок байтов.

Вы используете функции IPAddress.HostToNetworkOrder , которые гарантируют, что данные всегда будут в сетевом порядке (с прямым порядком байтов).

uint number = 234234233;
uint bigEndian = (uint)IPAddress.HostToNetworkOrder((int)number);
byte[] b = BitConverter.GetBytes(bigEndian);
5
ответ дан 3 December 2019 в 07:10
поделиться

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

5
ответ дан 3 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: