Pregunta

Normaly Si desea, por ejemplo, representa 5 en la matriz de bytes, será SMTH como {0x00,0x00,0x00,0x05} Pero BitConverter me da una matriz invertida ({0x05,0x0000,0x00,0x00}) por qué es así y donde estoy '' ¿Estoy mal?

¿Fue útil?

Solución

Lo más probable es que esté en una arquitectura pequeña (es el caso de las arquitecturas comunes X86 y X86-64). Puedes verificar esto con el BitConverter.IsLittleEndian propiedad. En tal arquitectura, el el menos importante byte viene primero, lo que explica por qué

BitConverter.GetBytes(5)

produce

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

Por supuesto, podría revertir la matriz si es necesario en función de la endianness del sistema/objetivo. Puedes encontrar tal EndianBitConverter listado aquí.

Otros consejos

Escribí las siguientes clases de envoltura para manejar el caso del BitConverter esperando poco 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);
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top