Python如何生成指定数量连续1 实现IP前缀转子网掩码
Python实现IP前缀转点分二进制子网掩码
实现思路
核心逻辑完全匹配需求:
- 先做入参校验:IPv4前缀长度合法范围是0~32的整数,非法输入直接抛出错误
- 生成总长度32位的原始二进制串:前
prefix_len位填充连续的1,剩余位补0 - 将32位二进制串按每8位为一组切分,组间用
.拼接,得到最终要求的格式
完整实现代码
def prefix_to_bin_mask(prefix_len: int) -> str: if not isinstance(prefix_len, int) or not 0 <= prefix_len <= 32: raise ValueError("IPv4前缀长度必须是0-32之间的整数") # 拼接32位二进制掩码 mask_bin_str = '1' * prefix_len + '0' * (32 - prefix_len) # 按8位分段拼接为点分格式 return '.'.join(mask_bin_str[i:i+8] for i in range(0, 32, 8))
效果验证
测试前缀长度21的场景:
print(prefix_to_bin_mask(21))
运行输出:
11111111.11111111.11111000.00000000
其他常用前缀测试结果:
- 前缀0:
00000000.00000000.00000000.00000000 - 前缀24:
11111111.11111111.11111111.00000000 - 前缀32:
11111111.11111111.11111111.11111111
如果需要同步输出十进制点分格式的子网掩码,只需要在切分后把每段8位二进制转成十进制再拼接即可,扩展逻辑如下:
def prefix_to_decimal_mask(prefix_len: int) -> str: if not isinstance(prefix_len, int) or not 0 <= prefix_len <= 32: raise ValueError("IPv4前缀长度必须是0-32之间的整数") mask_bin_str = '1' * prefix_len + '0' * (32 - prefix_len) return '.'.join(str(int(mask_bin_str[i:i+8], 2)) for i in range(0, 32, 8)) # 测试21前缀的十进制掩码,输出255.255.248.0 print(prefix_to_decimal_mask(21))
内容的提问来源于stack exchange,提问作者Nischal Lamichhane
相关产品推荐
相关产品推荐

