Получите наименьшую сеть, учитывая список адресов IPv4 в Python

Я использую Python 2.6.6, и мне не разрешено его менять. У меня есть отсортированный список адресов IPv4. Мне нужно найти самую маленькую сеть, которая покрывает все IP-адреса в списке. Наименьшей сетью может быть CIDR или сетевой адрес с маской подсети. Я еще не нашел простого способа сделать это с помощью модуля netaddr. Вот пример:

x=['192.168.0.0', '192.168.2.245', '192.168.255.255']
cidr = get_cidr_for_addresses(x)
print cidr ##should print '192.168.0.0/16'

person The Governor    schedule 11.12.2014    source источник
comment
Почему бы вам не использовать побитовые операции, чтобы понять это? Превратите адреса в биты, найдите первый другой бит и возьмите все предыдущие биты в качестве своей сети, а затем инвертируйте это число, чтобы получить подсеть. Если вам нужна дополнительная информация, это может помочь визуализировать ее: subnet-calculator.com   -  person Srdjan Grubor    schedule 11.12.2014
comment
Спасибо. Назовите меня ленивым, но я ищу библиотеку, которая сделает это за меня, чтобы мне не приходилось поддерживать код.   -  person The Governor    schedule 11.12.2014


Ответы (1)


Кажется, это именно то, что делает netaddr.spanning_cidr.

$ python
Python 2.7.9rc1 (default, Dec 10 2014, 10:58:16)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import netaddr
>>> x = netaddr.spanning_cidr(['192.168.0.0', '192.168.2.245', '192.168.255.255'])
>>> print x
192.168.0.0/16
>>> print type(x)
<class 'netaddr.ip.IPNetwork'>
person jamessan    schedule 11.12.2014