【问题标题】:why do we shift bits while checking ip address为什么我们在检查IP地址时要移位
【发布时间】:2010-06-21 05:23:11
【问题描述】:

我有一个 IP 地址范围,我需要检查访问我的应用程序的客户端是否在该范围内。我浏览了几篇文章,它们在拆分 IP 后会移位

例如 127.0.0.1 在 '. ' 拆分后我们得到一个由 4 个元素组成的数组,每个元素都被移位

element 1 >> 24;

等....并总结在一起检查。

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

【问题讨论】:

  • 你应该给出完整的代码。 求和 IP 地址的元素听起来不是检查它是否在一个范围内的正确方法。
  • 我猜您正在将 4 字节数组转换为 32 位整数。阅读大端和小端。

标签: c# operators ip-address


【解决方案1】:

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

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

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

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

例子:

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

【讨论】:

    【解决方案2】:

    我不确定你指的是什么,但我会冒险猜测你在使用口罩?

    即如果您想检查您的范围是否为 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 & 255.0.0.0 = 0111 1111。 0000 0000 。 0000 0000 。 0000 0000 = 127.0.0.0

    127.0.0.1 & 255.0.0.0 >> 24 = 0111 1111 = 127

    【讨论】:

      【解决方案3】:

      IP 地址的每个八位字节为 8 位,因此整个地址为 32 位并且适合整数。我猜他们正在通过提取四个八位字节并将它们移位到 int 中的四个单词来将 IP 地址的字符串表示形式转换为整数

      【讨论】:

      • 击败我,虽然这意味着左移,而不是像 OP 中那样的右移...
      【解决方案4】:

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

      找出您拥有的 IP 地址是否属于您要检查的掩码 IP 地址也容易得多。将其打包为整数,将它们都移到掩码中归零的位数,然后通过简单的相等操作将它们相互比较。 (127.0.0.1/8 -> 0x7F000001 >> 8 -> 0x7F0000 == (0x7F000005 >> 8)

      【讨论】:

        猜你喜欢
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        • 2012-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多