一个 /26 的三个特殊数
(每道题开头都有同一段:to_int 把点分十进制变成 32 位整数,to_str 变回去,mask(前缀长度) 给出掩码的整数——高位连续的 1,低位 0。)
(这一节还多了四个函数:network 网络地址、broadcast 广播地址、same_net 判同网段、hosts 可用主机数。)
打印机 192.168.10.77 在 /26 下:网络地址、广播地址、可用主机数:
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 network(ip, prefix):
return to_str(to_int(ip) & mask(prefix))
def broadcast(ip, prefix):
return to_str((to_int(ip) & mask(prefix)) | (~mask(prefix) & 0xFFFFFFFF))
def same_net(a, b, prefix):
return to_int(a) & mask(prefix) == to_int(b) & mask(prefix)
def hosts(prefix):
return 2 ** (32 - prefix) - 2
ip = "192.168.10.77"
print(network(ip, 26) + "/" + broadcast(ip, 26) + "/" + str(hosts(26)))
全部评论