C# BitConverter问题

3

通常,如果您想在字节数组中表示5,它应该是{0x00,0x00,0x00,0x05}。但是BitConverter却给了我一个反过来的数组({0x05,0x00,0x00,0x00}),这是为什么?我错在哪里了?


1
http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx 大端和小端? - Per Fagrell
2个回答

3

很可能你的计算机采用的是小端序架构(x86和x86-64常见采用此种架构)。你可以通过使用BitConverter.IsLittleEndian属性进行验证。 在这种架构中,最不重要的字节排在最前面,这也解释了为什么

BitConverter.GetBytes(5)

产生

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

如果需要根据系统/目标字节顺序,您当然可以反转数组。您可以在此处找到名为 EndianBitConverter 的工具类的代码:这里


1

我编写了以下包装类来处理 BitConverter 期望 Little 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);
    }

三元运算符中的条件重复。 - Alex from Jitbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接