Question

Normaly si vous voulez par exemple représenter 5 dans le tableau d'octets, il sera lissée comme {} 0x00,0x00,0x00,0x05 mais BitConverter me donne tableau inversé ({0x05,0x00,0x00,0x00}) Pourquoi est-il si et où je me trompe?

Était-ce utile?

La solution

Les chances sont que vous êtes sur une architecture little-endian (ce qui est le cas pour les architectures x86 et les architectures x86-64 commun). Vous pouvez le vérifier avec la propriété BitConverter.IsLittleEndian. Sur une telle architecture, le moins significative octet vient en premier, ce qui explique pourquoi

BitConverter.GetBytes(5)

produit

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

Vous pouvez bien inverser le cours du tableau si nécessaire en fonction du système boutisme / cible. Vous pouvez trouver un tel EndianBitConverter la liste .

Autres conseils

J'ai écrit les classes d'emballage suivantes pour traiter le cas de l'BitConverter attend peu 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);
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top