划分子网范围的算法

时间:2015-04-09 12:53:57

标签: python algorithm

有一个有趣的算法,用于划分子网范围。

我有一个子网,例如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'}]

因此,如果你有一个很好的算法,请在这里显示。

1 个答案:

答案 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'}]