Как получить префикс IP, когда у нас есть подсеть и адрес IPv4, используя python-netaddr?

Я использую библиотеку python-netaddr для работы с IP-адресами и подсетями. Я прочитал полную документацию по netaddrd: Документация по Netaddr. Но решения моей проблемы не нашел. У меня есть IP-адрес и подсеть, я хочу получить префикс для этого IP-адреса, используя их оба. Так что я могу распечатать все IP-адреса, поступающие в подсеть.

Например:

Ip Address: 192.0.2.0
Subnet Network: 255.255.255.0

It should return the prefix which is : 24

person Amit Pal    schedule 30.05.2012    source источник
comment
Откуда 24?   -  person Oliver    schedule 30.05.2012
comment
Вы пробовали, например. IPAddress('192.0.2.0/255.255.255.0')? Вы можете получить список всех адресов в этой подсети с примером в документации, на которую вы ссылаетесь.   -  person Some programmer dude    schedule 30.05.2012
comment
Является ли /24 способом представления маски 255.255.255.0, которая также является 11111111.11111111.11111111.00000000   -  person Diego Navarro    schedule 30.05.2012
comment
Итак, вы хотите, учитывая точечную сетевую маску, получить длину префикса? IP-адрес здесь не имеет значения, не так ли?   -  person Martijn Pieters    schedule 30.05.2012
comment
IPAddress() не поддерживает маски сети или префиксы подсети! Вот почему вам нужно использовать IPNetwork()   -  person Maria Zverina    schedule 30.05.2012
comment
@Oliver Я только что дал образец, проверенный в Интернете.   -  person Amit Pal    schedule 30.05.2012
comment
@JoachimPileborg Я сделал, это показывает: IPAddress () не поддерживает маски сети или префиксы подсети! Подробности смотрите в документации.   -  person Amit Pal    schedule 30.05.2012


Ответы (4)


Чтобы получить 24, вы можете использовать следующий фрагмент

ip = IPNetwork('192.0.2.0/255.255.255.0')
print ip.prefixlen

Но если вам нужен список всех адресов в подсети, его проще использовать:

ip = IPNetwork('192.0.2.0/255.255.255.0')
list(ip)
person Maria Zverina    schedule 30.05.2012

С заданной сетевой маской мы можем получить префикс с помощью следующей функции:

def getPrefix(mask):
    prefix = sum([bin(int(x)).count('1') for x in mask.split('.')])
    return prefix
person Vinodini Thambudurairaj    schedule 25.02.2014

def getPrefix(binary):
    prefixCount=0
    for i in (str(binary)):
        if(i == '1'):
            prefixCount+=1
    return prefixCount

Это вернет ваш «Prefixcount», если подсеть преобразована в двоичный формат и указана на входе.

person Vinodini Thambudurairaj    schedule 24.02.2014

Маска подсети: 255.255.255.0 Вот как это выглядит: 1 . 1 . 1. 0

255 - это ВСЕ 8 бит. т.е. ВСЕ 1. И 0 означает, что ВСЕ 8 бит отключены. если вы посмотрите на эту маску подсети [255.255.255.0], первые 3 октета ВСЕ ВКЛЮЧЕНЫ, а последний октет выключен. мы можем сказать: 255.255.255.0 1 . 1 . 1,0 8 + 8 + 8 + 0 = 24

person wils mahn    schedule 03.06.2014
comment
Кажется, вы могли бы разделить его, bitwise-and и соединить обратно. - person woot; 03.06.2014