为什么我们在检查IP地址时移位

时间:2010-06-21 05:23:11

标签: c# operators ip-address

我有一系列的IP地址,我需要检查访问我的应用程序的客户端是否属于该范围。我通过几篇文章,他们在拆分IP后移位了

例如127.0.0.1在'之后被拆分。 '并且在分裂之后我们得到一个包含4个元素的数组,并且每个元素都被移位

element 1 >> 24;
等等......总结起来检查。

我可以知道为什么我们在这里使用移位运算符吗?

4 个答案:

答案 0 :(得分:4)

代码可能应该是这样的(我没有运行它,因此您可能需要修复小问题,如小编译错误或溢出处理):

uint GetIpValue(uint[] values)
{
  return (values[0] << 24) + 
         (values[1] << 16) + 
         (values[2] << 8) + 
         (values[3]);
}

如果IP的左侧部分较大,则创建uint值更大,这是IP比较通常定义的方式。

您现在可以计算每个此类IP值,以查看它是否低于或大于另一个IP值。

示例:

bool IsIpInRange(uint[] ip, uint[] ipStart, uint[] ipEnd)
{
  uint ipValue = GetIpValue(ip);
  return ipValue >= GetIpValue(ipStart) && ipValue <= GetIpValue(ipEnd);
}

答案 1 :(得分:1)

我不确定你指的是什么,但我猜你还在使用面具?

即。如果你想检查你的范围是127.XXX.XXX.XXX那么你的掩码是/ 8,这意味着你只保留了32位的8位。你需要移位24位以便你可以看看127。

127.0.0.1 = 0111 1111。 0000 0000 0000 0000 0000 0001

127.0.0.1&amp; 255.0.0.0 = 0111 1111。 0000 0000 0000 0000 0000 0000 = 127.0.0.0

127.0.0.1&amp; 255.0.0.0&gt;&gt; 24 = 0111 1111 = 127

答案 2 :(得分:1)

IP地址的每个八位字节是8位,因此整个地址是32位并且适合整数。我猜测他们将IP地址的字符串表示转换为整数,方法是拉出四个八位字节并将它们移位到int中的四个字

答案 3 :(得分:0)

这里只是猜测,但似乎完全符合逻辑,因为IPv4地址适合整数(它们都是4个字节),检查范围可以通过普通<>运算符来完成。您所做的就是将IPv4地址打包为整数(127.0.0.1 - > 0x7F000001),并检查它是否在两个先前打包的间隔边缘的范围内,就像您只是检查5是否在1 ... 10间隔。

查明您所拥有的IP地址是否属于您正在检查的屏蔽IP地址也更加容易。将其打包为整数,将它们都移动到掩码中归零的位数,然后通过简单的相等操作将它们相互比较。 (127.0.0.1/8 - &gt; 0x7F000001&gt;&gt; 8 - &gt; 0x7F0000 ==(0x7F000005&gt;&gt; 8)&lt; - 127.0.0.5)