2015-04-17 3 views
0

У меня есть адрес IP-1.2.3.4 с маской подсети 255.255.255.0как вы преобразовываете в cidr в python3?

Я хочу, чтобы преобразовать это в CIDR нотации 1.2.3.4/24

Как это сделать в Python3?

+0

из командной строки. – mine

+1

sum ([bin (int (x)). Count ('1') для x в '255.255.255.0'.split ('. ')]) – rfkortekaas

+0

@PadraicCunningham: Какой формат входит? Я предполагаю, что у него всего две строки: «1.2.3.4» и «255.255.255.0». (Я полагаю, что это возможно, что у него есть, скажем, два 32-битных целых числа 16909060 и 4294967040, но я думаю, он бы упомянул об этом, если да.) – abarnert

ответ

2

Используйте модуль ipaddress в стандартной библиотеке.


Адрес плюс сетевая маска - это либо сеть, либо интерфейс, а не адрес. Учитывая, что у вас установлены некоторые из битов хоста (это 1.2.3.4, а не 1.2.3.0), либо у вас есть интерфейс, либо у вас есть неканоническое имя для сети; Я предполагаю, что это интерфейс, так что используйте ip_interface:

>>> i = ipaddress.ip_interface('1.2.3.4/255.255.255.0') 

Или, если вы хотите, чтобы убедиться, что он явно IPv4 не IPv6:

>>> i = ipaddress.IPv4Interface('1.2.3.4/255.255.255.0') 

Или вы можете составить его из адреса и сети, а не из комбинированной строки. Это зависит от того, в каком формате у вас есть эта информация и что имеет смысл для вас.


Чтобы получить формат CIDR, используйте with_prefixlen аксессор:

>>> i.with_prefixlen 
'1.2.3.4/24' 

Вы также можете сделать все виды других хитроумных вещей извлечет адрес (1.2.3.4) в качестве i.address, или (1.2.3.0/24) в качестве i.network или перечислить все адреса в сети путем обработки i.network в качестве последовательности и т. д.

0

Для этого вы можете использовать библиотеку IPy. Если вы прокрутите страницу вниз до документации, вы можете увидеть конверсии строк, которые она может выполнить. Ключевым вопросом является strNormal(1)

IP("1.2.3.4/255.255.255.0").strNormal(1) 
Смежные вопросы