Диапазон IP-адресов для преобразования CIDR в Python?
Как я могу получить нотацию CIDR, представляющую диапазон IP-адресов, учитывая начальный и конечный IP-адреса диапазона, в Python? Я могу найти CIDR to IP Range, но не могу найти код для обратного.
Пример желаемого выхода:
startip = '63.223.64.0'
endip = '63.223.127.255'
return '63.223.64.0/18'
3 ответа
Решение
Вы можете использовать iprange_to_cidrs
предоставляется модулем netaddr. Пример:
cidrs = netaddr.iprange_to_cidrs(startip, endip)
Вот официальные документы: https://netaddr.readthedocs.io/
Начиная с Python 3.3, ipaddress в комплекте может предоставить то, что вы хотите. Функция sumrize_address_range возвращает итератор с сетями, полученными в начале, в конце вы указываете:
>>> 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')]
Если, как и я, вам нужен только 1 cidr (вместо нескольких cidr), вам нужно будет использовать функцию из любогоnetaddr
pip install netaddr
from netaddr import spanning_cidr
spanning_cidr(startip, endip)
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)
IPv4Network('63.192.0.0/10')