[英]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.