Диапазон 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)

или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)
IPv4Network('63.192.0.0/10')
Другие вопросы по тегам