有一个有趣的算法,用于划分子网范围。
我有一个子网,例如192.168.1.0/24或192.168.1.248/22,依此类推。我们知道'/ 24'或'/ 22'代表网络,'(32 - 24)'或'(32-22)代表hosts.So使用192.168.1.0/24,我想划分子网分为两个范围,第一个是192.168.1.1 - 192.168.1.127,第二个是192.168.1.128 - 192.168.1.254。
所以我需要一个算法来解析它可以通过使用python将给定的苹果酒子网划分为两个范围。输入是cidr子网,输出是两个ip范围。这是一个例子:
Input : 192.168.1.0/24
Output: [{'start_address':'192.168.0.1','end_address':'192.168.0.127'},
{'start_address':'192.168.0.128','end_address':'192.168.0.245'}]
因此,如果你有一个很好的算法,请在这里显示。
答案 0 :(得分:0)
您想要一个算法,还是想要一个解决方案?
对于解决方案,在Python 3中,使用ipaddress
模块。 PyPI中有一个Python 2的后端。
如果您需要算法,可以阅读模块的代码。
使用ipaddress
模块:
import ipaddress
network = ipaddress.ip_network('192.168.1.0/24')
hosts = list(network.hosts())
subnets = [{'start_address': str(list(subnet.hosts())[0]),
'end_address': str(list(subnet.hosts())[-1])}
for subnet in network.subnets()]
print(subnets)
<强>输出强>
[{'start_address': '192.168.1.1', 'end_address': '192.168.1.126'}, {'start_address': '192.168.1.129', 'end_address': '192.168.1.254'}]
这与你想要的非常接近。丢失的是192.168.1.127,它是第一个子网的广播地址,192.168.1.128是第二个子网的网络地址,192.168.1.255是第二个子网的广播地址。
要获得准确的输出,您可以拆分主机列表:
hosts = list(network.hosts())
subnets = [{'start_address': str(subnet[0]), 'end_address': str(subnet[-1])}
for subnet in (hosts[:len(hosts)//2], hosts[len(hosts)//2:])]
print(subnets)
<强>输出强>
[{'start_address': '192.168.1.1', 'end_address': '192.168.1.127'}, {'start_address': '192.168.1.128', 'end_address': '192.168.1.254'}]