我有一系列的IP地址,我需要检查访问我的应用程序的客户端是否属于该范围。我通过几篇文章,他们在拆分IP后移位了
例如127.0.0.1在'之后被拆分。 '并且在分裂之后我们得到一个包含4个元素的数组,并且每个元素都被移位
element 1 >> 24;
等等......总结起来检查。
我可以知道为什么我们在这里使用移位运算符吗?
答案 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)