六个地址各是什么
(每道题开头都有同一段:to_int 把点分十进制变成 32 位整数,to_str 变回去,mask(前缀长度) 给出掩码的整数——高位连续的 1,低位 0。)
is_private 查三个私有段,kind 再分回环、广播、公网。看六个地址:
def to_int(ip):
a, b, c, d = [int(x) for x in ip.split(".")]
return (a << 24) | (b << 16) | (c << 8) | d
def to_str(n):
return ".".join(str((n >> s) & 255) for s in (24, 16, 8, 0))
def mask(prefix):
return (0xFFFFFFFF << (32 - prefix)) & 0xFFFFFFFF
def is_private(ip):
n = to_int(ip)
return (n & mask(8) == to_int("10.0.0.0") or n & mask(12) == to_int("172.16.0.0") or n & mask(16) == to_int("192.168.0.0"))
def kind(ip):
if ip == "255.255.255.255":
return "广播"
if to_int(ip) & mask(8) == to_int("127.0.0.0"):
return "回环"
if is_private(ip):
return "私有"
return "公网"
print(",".join(ip + ":" + kind(ip) for ip in ("192.168.10.5", "8.8.8.8", "127.0.0.1", "10.1.2.3", "172.20.0.1", "172.32.0.1")))
全部评论