BitConverter.ToInt32如何工作?

时间:2011-11-03 11:07:30

标签: c# bit-manipulation

这是一种方法 -

using System;

class Program
{
    static void Main(string[] args)
    {
        //
        // Create an array of four bytes.
        // ... Then convert it into an integer and unsigned integer.
        //
        byte[] array = new byte[4];
        array[0] = 1; // Lowest
        array[1] = 64;
        array[2] = 0;
        array[3] = 0; // Sign bit
        //
        // Use BitConverter to convert the bytes to an int and a uint.
        // ... The int and uint can have different values if the sign bit differs.
        //
        int result1 = BitConverter.ToInt32(array, 0); // Start at first index
        uint result2 = BitConverter.ToUInt32(array, 0); // First index
        Console.WriteLine(result1);
        Console.WriteLine(result2);
        Console.ReadLine();
    }
}

输出

16385 16385

我只是想知道这是怎么回事?

6 个答案:

答案 0 :(得分:14)

BitConverter.ToInt32的文档实际上有一些非常好的例子。假设BitConverter.IsLittleEndian返回true,array[0]是最不重要的字节,正如您所示......虽然array[3]不仅仅是符号位,但它是包括符号位(如第7位),但其余位用于幅度。

所以在你的情况下,最低有效字节是1,下一个字节是64 - 所以结果是:

( 1 * (1 << 0) ) +    // Bottom 8 bits
(64 * (1 << 8) ) +    // Next 8 bits, i.e. multiply by 256
( 0 * (1 << 16)) +    // Next 8 bits, i.e. multiply by 65,536
( 0 * (1 << 24))      // Top 7 bits and sign bit, multiply by 16,777,216

这是16385.如果设置了符号位,你需要以不同的方式考虑这两种情况,但在这种情况下它很简单。

答案 1 :(得分:4)

它转换为基数为256的数字。所以在你的情况下:1 + 64 * 256 = 16385

答案 2 :(得分:3)

查看.Net 4.0框架reference sourceBitConverter确实可以解释Jon's answer的说法,尽管它使用指针(unsafe代码)来处理数组。 / p>

但是,如果第二个参数(即startindex)可被4整除(如示例中的情况),则框架采用快捷方式。它需要一个指向byte的{​​{1}}指针,将其转换为value[startindex]指针,然后取消引用它。无论int是否为真,这个技巧都有效。

从高层来看,这基本上只意味着代码指向IsLittleEndian数组中的4个字节并断然声明,“那里的内存块有byte!” (然后返回它的副本)。当你考虑到引擎盖时,int 只是一块内存时,这就非常有意义了。

以下是框架int方法的源代码:

ToUint32

答案 3 :(得分:0)

  

array [0] = 1; //最低// 0x01
数组[1] = 64; //   0x40
数组[2] = 0; // 0x00
数组[3] = 0; //签名   为0x00

如果组合每个十六进制值 0x00004001

MSDN documentatin解释了所有内容

答案 4 :(得分:0)

您可以找自己-https://referencesource.microsoft.com/#mscorlib/system/bitconverter.cs,e8230d40857425ba

如果数据是按字对齐的,它将仅将内存指针转换为int32。

return *((int *) pbyte);

否则,它使用字节存储指针值中的按位逻辑。

答案 5 :(得分:-1)

对于那些与Little Endien和Big 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);
    }