在Python中如何将IP范围转换为CIDR?

29 投票
3 回答
34099 浏览
提问于 2025-04-18 09:44

我想知道怎么在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/

撰写回答