【问题标题】:Converting BYTE array to INT将 BYTE 数组转换为 INT
【发布时间】:2014-03-05 13:31:36
【问题描述】:

我有这种代码

static void Main(string[] args)
{
     byte[] array = new byte[2] { 0x00, 0x1f };
     Console.WriteLine(BitConverter.ToInt32(array, 0));
}

但是它不起作用。它抛出一个异常:

目标数组不够长,无法复制 收藏。检查数组索引和长度。

怎么了?

【问题讨论】:

    标签: c# arrays type-conversion


    【解决方案1】:

    顾名思义,Int32 是 32 位,即 4 个字节,因此如果要将字节数组转换为 Int32,它的长度至少需要为 4,(或更准确地说,它需要在起始位置之后至少有 4 个字节)。

    如果你只有两个字节,也许你打算使用ToInt16

    【讨论】:

      【解决方案2】:

      BitConverter.ToInt32 上的 documentation 说:

      ToInt32 方法将索引 startIndex 到 startIndex + 3 的字节转换为 Int32 值。

      您需要指定至少 4 个字节,但您只有 2 个。

      【讨论】:

        【解决方案3】:

        Int32 由 4 个字节组成,但数组只有 2 个字节。解决此问题的一种方法是先转换为 Int16,然后再转换为 Int32

        Console.WriteLine((Int32)(BitConverter.ToInt16(array, 0)));
        

        请注意,在此特定用法中,从 Int16 转换为 Int32 不会改变任何内容,因为数字打印相同。

        【讨论】:

        • 正如将十进制数“10”写为“0010”也不会改变任何其他内容:额外的零是没有意义的,当您转换 Int16 时或多或少会做同样的事情到 Int32。
        【解决方案4】:

        这是一个老问题,但对于 .NET Core / .NET Standard > 2.1 有新的解决方案:

        System.Buffers.Binary.BinaryPrimitives class为此提供了两个静态方法ReadInt32BigEndianReadInt32LittleEndian

        使用这些方法有两个优点:

        1. 它允许您明确指定您的号码是否存储为little endian or big endian
        2. 他们接受Span<T>,这可能是性能优势,具体取决于场景。

        【讨论】:

          猜你喜欢
          • 2018-08-31
          • 2011-06-24
          • 1970-01-01
          • 1970-01-01
          • 2012-02-05
          • 1970-01-01
          • 2022-01-11
          • 2020-02-03
          • 1970-01-01
          相关资源
          最近更新 更多