Как преобразовать префикс CIDR в сетевую маску с четырьмя точками в Python?

Как я могу преобразовать префикс CIDR в сетевую маску с четырьмя точками в Python?

Например, если префикс 12, мне нужно вернуть 255.240.0.0.


person planetp    schedule 28.04.2014    source источник


Ответы (4)


Вы можете сделать это следующим образом:

def cidr(prefix):
    return socket.inet_ntoa(struct.pack(">I", (0xffffffff << (32 - prefix)) & 0xffffffff))
person Greg Hewgill    schedule 28.04.2014
comment
Я получаю эту ошибку в python 3.4: struct.error: 'I' format requires 0 <= number <= 4294967295 - person planetp; 29.04.2014
comment
Хорошо, я обновил ответ, чтобы учесть эту проверку ошибок. - person Greg Hewgill; 29.04.2014

Вот решение на более легкой стороне (без зависимостей модуля):

netmask = '.'.join([str((0xffffffff << (32 - len) >> i) & 0xff)
                    for i in [24, 16, 8, 0]])
person Curt    schedule 08.01.2015

И это более эффективно:

netmask = 0xFFFFFFFF & (2**(32-len)-1)

или, если у вас есть трудности с подсчетом количества F:

netmask = (2**32-1) & ~ (2 ** (32-len)-1)

и теперь, возможно, еще более эффективный (хотя и более трудный для чтения):

netmask = (1<<32)-1 & ~ ((1 << (32-len))-1)

Чтобы получить версию маски dotted.quad, вы можете использовать inet.ntoa для преобразования приведенной выше сетевой маски.
Примечание: для единообразия с другим сообщением я использовал 'len' в качестве длины маски, даже если мне это не нравится. использовать имя функции в качестве имени переменной.

person user3435121    schedule 10.12.2018

Еще один способ сделать это

>> cidr=22
>> netmask = '.'.join([str((m>>(3-i)*8)&0xff) for i,m in enumerate([-1<<(32-cidr)]*4)])
>> print(netmask)
'255.255.252.0'
person kriss    schedule 20.12.2020