繁体   English   中英

从 IP 列表计算网络掩码

[英]Calculate netmask from list of IP's

我有一个 IPv4 地址列表,它们都在同一个网络上。 给定IP列表,我想计算该网络的网络掩码。

列表:

192.168.2.2
192.168.2.3
192.168.2.4

生成的网络掩码:255.255.255.0

当前算法:如果八位字节不同,则在该网络掩码 position 中放置一个0 ,否则放置255

prev_ip = None
current_netmask = [255,255,255,255]
for ip in ip_list:
  if prev_ip != None:
    for i in range(0,4):
      if ip.split('.')[i] != prev_ip.split('.')[i]:
        current_netmask[i] = 0
  prev_ip = ip    

我的问题是这个网络掩码并不总是正确的,而且我知道其他网络掩码是可能的(除了由 0 和 255 组成的网络掩码)

我认为这会奏效。 将地址转换为整数,以全 1 的掩码开始,并且将从最低有效位开始逐渐为零增加的位,而当 IP 与掩码按位与运算时,IP 会有所不同。 (每个新的 IP 只需要与已经考虑的 IP 之一进行比较,因为在那个阶段,掩码已经反映了与所考虑的其他 IP 的比较,因此与vals[0]的行。)最后它将掩码转换回虚线四边形表示。

def to_int(ip):
    bytes = [int(s) for s in ip.split(".")]
    return sum(val<<(8*i) for i, val in enumerate(reversed(bytes)))

def from_int(val):
    r = []
    while val:
        r.append(val & 0xFF)
        val >>= 8
    if len(r) < 4:
        r.extend([0] * (4-len(r)))
    return ".".join(map(str, reversed(r)))

def get_mask(ips):
    vals = [to_int(ip) for ip in ips]
    mask = 0xFFFFFFFF
    bit = 1
    for val in vals[1:]:
        while vals[0] & mask != val & mask:
            mask &= ~bit
            bit <<= 1
    return from_int(mask)

ips = ["192.168.2.2", "192.168.2.3", "192.168.2.4"]
print(get_mask(ips))

给出:

255.255.255.248

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM