关于数组:C#BitConverter问题

C# BitConverter problems

正常情况下,例如,如果要在字节数组中表示5,它将是类似于0x00,0x00,0x00,0x05的smth,但bitconverter给了我反向数组(0x05,0x00,0x00,0x00)为什么是这样?我哪里错了?


很可能您使用的是小endian体系结构(对于常见的x86和x86-64体系结构就是这样)。您可以使用BitConverter.IsLittleEndian属性来验证这一点。在这种体系结构中,最不重要的字节排在第一位,这就解释了为什么

1
BitConverter.GetBytes(5)

生产

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

当然,如果需要的话,可以根据系统/目标端序来反转数组。你可以在这里找到这样一个EndianBitConverter


我编写了以下包装器类来处理BitConverter的情况,只需要很少的endien。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    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);
    }