IP地址类GetAddressBytes方法将八位字节放在字节数组的奇数索引中

时间:2014-03-05 03:07:31

标签: c#

我正在尝试使用C#中内置的IP地址类创建一个在哈希表中存储ip地址的程序。我首先使用文本框为用户输入IP地址。然后,我的代码从文本框中获取文本,将其放入字符串变量中,然后使用IPAddress.Parse方法在IP地址数据类型中验证/存储它。

// Variables
IPAddress address;
string userEntry;

// Grab the IP, verify it, and convert it to the IP Address data type
userEntry = textBox1.Text;
address = IPAddress.Parse(userEntry);

然后我有一个函数,它接受IP地址(通过IP地址数据类型)并使用GetAddressBytes方法将其转换为字节数组。在此之后,我使用for循环遍历字节数组,并将每个索引的值乘以256,以降序查看八位字节的位置的幂(即,第一个八位字节的乘以乘以256 ^ 3,第二个由256 ^ 2等...)。我这样做是为了让每个IP地址都有一个唯一的编号(将IP地址转换为整数形式),我将能够将其输入到我的散列算法中。

        private UInt32 ConvertIP(IPAddress address) {
        byte[] bytes = address.GetAddressBytes();
        int counter = 3;
        uint answer = 0;

        for (int i = 0; i < bytes.Length; i++) {

            MessageBox.Show(bytes[i].ToString());

            answer = answer + Convert.ToUInt32(bytes[i] * Math.Pow(256, counter));

            counter--;

        }

        return answer;
    }

我原本以为这会很好用,直到我发现我可以输入部分IP地址,如255,255.255和255.255.255。当使用断点来观察不同的八位字节被添加到字节数组时,八位字节似乎以奇数顺序添加到字节数组中。当您输入255时,八位字节将被添加到数组中的第三个点(实际上是第四个,但标记为3,因为数组从零开始),但是,当您输入255.255时,八位字节将被放置在第三个点和0点字节数组,而不是像我想的那样在数组的第3和第2个点。下面是一张图片。

有没有人知道为什么八位字节以奇怪的顺序放在字节数组中?这是我做错的事吗?

1 个答案:

答案 0 :(得分:0)

文档

中提到了此行为的原因
  

单部分地址直接存储在网络地址中。两部分地址,便于指定A类地址,将前导部分放在网络地址的最右边三个字节的第一个字节和尾部。三部分地址,便于指定B类地址,将第一部分放在第一个字节中,第二部分放在第二个字节中,最后部分放在网络地址的最右边两个字节中。例如:

当输入少于4个零件的点符号地址时,它会将其解释为A,B或C类地址(取决于输入的零件数量)