【问题标题】:C# BitConverter problemsC# BitConverter 问题
【发布时间】:2011-12-03 07:57:56
【问题描述】:

通常,如果你想在字节数组中表示 5,它会像 {0x00,0x00,0x00,0x05} 但 BitConverter 给我反转数组({0x05,0x00,0x00,0x00}) 为什么会这样,我错在哪里?

【问题讨论】:

标签: c# arrays bitconverter


【解决方案1】:

您可能使用的是 little-endian 架构(常见的 x86 和 x86-64 架构就是这种情况)。您可以使用 BitConverter.IsLittleEndian 属性验证这一点。 在这样的架构上,最不重要字节排在第一位,这就解释了为什么

BitConverter.GetBytes(5)

生产

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

如果需要,您当然可以根据系统/目标字节序反转数组。您可以在here 中找到这样的EndianBitConverter

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果条件在三元运算符中重复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多