【问题标题】:Get next IP from a given subnet [Python]从给定子网获取下一个 IP [Python]
【发布时间】:2018-10-07 23:10:02
【问题描述】:

我想从给定的子网中获取下一个 IP。我知道如何从符号192.168.0.1/24 中获取 IP 范围,但我不知道如何获取范围内的下一个 IP。我写了这段代码:

def get_next_ip(ip):
    tmp = ip.split('.')
    val = int(tmp[0]) << 24 + int(tmp[1]) << 16 + int(tmp[2]) << 8 + int(tmp[3])
    val = val + 1
    octet3 = val & 0xFF
    octet2 = (val >> 8) & 0xFF
    octet1 = (val >> 16) & 0xFF
    octet0 = (val >> 24) & 0xFF
    next_ip = str(octet0) + "." + str(octet1) + "." + str(octet2) + "." + str(octet3)
    return next_ip

当我运行print get_next_ip("192.168.0.1") 时,它会打印0.0.0.1 而不是192.168.0.2。为什么?

【问题讨论】:

    标签: python ip subnet


    【解决方案1】:

    您的代码根本不尊重网络掩码。事实上,它甚至不使用它。你解析“。”并且不关心“/24”。

    您所完成的只是解析 IP4 地址,然后将数字加 1 以确保应用翻转。

    如果你想要下一个 IP 在这种情况下下一个 ip+268

    import ipaddress
    ipaddress.ip_address('192.168.0.4') + 268
    ip_str=str(ipaddress.ip_address('192.168.0.4') + 268
    

    ip_str 现在应该是 '192.168.1.16'

    【讨论】:

      【解决方案2】:

      这是因为优先级规则。
      位移不仅会影响每个 tmp[x],还会影响移位运算符之前的整个值。
      首先将 int(tmp[0]) 移动 24
      然后添加 int(tmp[1])
      然后将总和移动 16
      ...

      val = (int(tmp[0]) << 24) + (int(tmp[1]) << 16) + (int(tmp[2]) << 8) + int(tmp[3])  
      

      会做的。

      【讨论】:

      猜你喜欢
      • 2011-09-11
      • 2014-12-31
      • 2018-11-24
      • 2014-07-31
      • 2016-01-01
      • 2020-11-25
      • 1970-01-01
      • 2018-04-03
      • 2013-09-15
      相关资源
      最近更新 更多