在Python中如何将IP范围转换为CIDR?
我想知道怎么在Python中,根据一段IP地址的起始和结束地址,得到一个CIDR表示法。虽然我能找到从CIDR到IP范围的代码,但找不到反向的代码。
下面是我想要的输出示例:
startip = '63.223.64.0'
endip = '63.223.127.255'
return '63.223.64.0/18'
3 个回答
0
如果你和我一样,只想要一个 cidr(而不是多个 cidr),你需要使用 spanning_cidr
这个函数,来自于 netaddr
。
你可以通过运行 pip install netaddr
来安装它。
from netaddr import spanning_cidr
spanning_cidr([startip, endip])
或者你也可以使用 spanning_cidr
。
安装方法是运行 pip install spanning-cidr
。
from spanning_cidr import spanning_cidr
spanning_cidr([startip, endip])
下面是它们之间的区别……
>>> from ipaddress import IPv4Address, summarize_address_range
>>> from netaddr import spanning_cidr
>>>
>>> startip = IPv4Address('63.223.64.0')
>>> endip = IPv4Address('63.224.127.255')
>>> list(summarize_address_range(startip, endip))
[IPv4Network('63.223.64.0/18'),
IPv4Network('63.223.128.0/17'),
IPv4Network('63.224.0.0/17')]
>>>
>>> spanning_cidr([startip, endip])
IPNetwork('63.223.64.0/18')
39
从Python 3.3开始,内置的ipaddress模块可以满足你的需求。这个模块里的函数summarize_address_range可以返回一个迭代器,里面包含你指定的起始和结束地址所对应的网络信息:
>>> import ipaddress
>>> startip = ipaddress.IPv4Address('63.223.64.0')
>>> endip = ipaddress.IPv4Address('63.223.127.255')
>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(startip, endip)]
[IPv4Network('63.223.64.0/18')]
26
你可以使用 iprange_to_cidrs
这个功能,它是由 netaddr 模块提供的。下面是一个例子:
pip install netaddr
import netaddr
cidrs = netaddr.iprange_to_cidrs(startip, endip)
这里是官方文档: https://netaddr.readthedocs.io/