如何用Python 3.x根据前缀长度获取十进制子网掩码?
简化前缀长度转十进制子网掩码的Python实现
我需要一个工具,输入1-32之间的前缀长度就能输出对应的十进制子网掩码,用来辅助Cisco脚本开发,自己写了一段代码但希望能简化:
import math # 子网掩码八位组 octet1 = [0,0,0,0,0,0,0,0] octet2 = [0,0,0,0,0,0,0,0] octet3 = [0,0,0,0,0,0,0,0] octet4 = [0,0,0,0,0,0,0,0] # 幂次列表 pow_list = [7,6,5,4,3,2,1,0] # 输入前缀长度 mask = int(input("请输入前缀长度: ")) # 根据位数将数组元素从0改为1 while mask >= 25 and mask <= 32: octet4[mask-25] = 1 mask -= 1 while mask >= 17 and mask <= 24: octet3[mask-17] = 1 mask -= 1 while mask >= 9 and mask <= 16: octet2[mask-9] = 1 mask -= 1 while mask >= 1 and mask <= 8: octet1[mask-1] = 1 mask -= 1 # 统计1的数量 ones1 = octet1.count(1) ones2 = octet2.count(1) ones3 = octet3.count(1) ones4 = octet4.count(1) # 计算每个八位组的数值 sum1 = 0 for i in range(0,ones1): sum1 = sum1 + math.pow(2,pow_list[i]) sum1 = int(sum1) sum2 = 0 for i in range(0,ones2): sum2 = sum2 + math.pow(2,pow_list[i]) sum2 = int(sum2) sum3 = 0 for i in range(0,ones3): sum3 = sum3 + math.pow(2,pow_list[i]) sum3 = int(sum3) sum4 = 0 for i in range(0,ones4): sum4 = sum4 + math.pow(2,pow_list[i]) sum4 = int(sum4) # 拼接结果 decimal_netmask = str(sum1) + "." + str(sum2) + "." + str(sum3) + "." + str(sum4) # 输出结果 print("十进制子网掩码为: "+ decimal_netmask)
运行示例
输入前缀长度:23
十进制子网掩码为:255.255.254.0
简化后的代码
利用字符串拼接和进制转换可以大幅简化逻辑,去掉冗余的数组操作和循环:
prefix = int(input("请输入前缀长度: ")) # 生成32位二进制掩码字符串:前prefix位为1,其余为0 mask_binary = '1' * prefix + '0' * (32 - prefix) # 按每8位分割,转十进制后拼接成点分格式 octets = [str(int(mask_binary[i*8:(i+1)*8], 2)) for i in range(4)] decimal_netmask = '.'.join(octets) print(f"十进制子网掩码为: {decimal_netmask}")
简化说明
- 直接构造二进制掩码:用字符串快速生成32位掩码,替代原代码中多个数组的循环修改操作
- 批量处理八位组:通过列表推导式一次性完成分割、进制转换,避免重复的计数和累加逻辑
- 无额外依赖:去掉了
math库的依赖,代码更轻量易维护
这段简化代码和原代码功能完全一致,输入1-32的前缀长度都能正确输出对应的十进制子网掩码,更适合嵌入Cisco脚本开发中使用。
内容的提问来源于stack exchange,提问作者Jon Reyno
相关产品推荐
相关产品推荐

