Domanda

Normaly Se vuoi, ad esempio, rappresenti 5 in un array di byte sarà simile a {0x00,0x00,0x00,0x05} ma BitConverter mi dà array invertito ({0x05,0x00,0x00,0x00}) perché è così e dove io ' mi sbaglia?

È stato utile?

Soluzione

Le probabilità sono che tu sia su un'architettura poca-endiana (che è il caso delle comuni architetture X86 e X86-64). Puoi verificarlo con il BitConverter.IsLittleEndian proprietà. Su tale architettura, il meno significativo byte arriva per primo, il che spiega perché

BitConverter.GetBytes(5)

produce

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

Ovviamente è possibile invertire l'array se necessario in base al sistema/Endianness. Puoi trovare un tale EndianBitConverter elencato qui.

Altri suggerimenti

Ho scritto le seguenti classi wrapper per gestire il caso del BitConverter Aspettando un piccolo 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);
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top