def calc_subnet(ipaddr, prefix, is_ipv6=False):
if is_ipv6 and prefix == 128: return ipaddr
if not is_ipv6 and prefix == 32: return ipaddr
q = int(prefix / 8)
r = prefix % 8
if is_ipv6:
byte_ipaddr = socket.inet_pton(socket.AF_INET6, ipaddr)
results = list(bytes(16))
else:
byte_ipaddr = socket.inet_pton(socket.AF_INET, ipaddr)
results = list(bytes(4))
results[0:q] = byte_ipaddr[0:q]
v = 0
for n in range(r + 1):
if n == 0: continue
v += 2 ** (8 - n)
results[q] = byte_ipaddr[q] & v
if is_ipv6:
return socket.inet_ntop(socket.AF_INET6, bytes(results))
else:
return socket.inet_ntop(socket.AF_INET, bytes(results))
评论列表
文章目录