Comment convertir un masque de sous-réseau ipv4 en notation cidr à l'aide de la bibliothèque netaddr
?
Exemple: 255.255.255.0 to /24
Utilisation de netaddr
:
>>> from netaddr import IPAddress
>>> IPAddress('255.255.255.0').netmask_bits()
24
Utilisation de ipaddress
de stdlib:
>>> from ipaddress import IPv4Network
>>> IPv4Network('0.0.0.0/255.255.255.0').prefixlen
24
Vous pouvez également le faire sans utiliser aucune bibliothèque: il suffit de compter 1 bits dans la représentation binaire du masque de réseau:
>>> netmask = '255.255.255.0'
>>> sum(bin(int(x)).count('1') for x in netmask.split('.'))
24
>>> IPNetwork('0.0.0.0/255.255.255.0').prefixlen
24
Utilisez la fonction suivante. il est rapide, fiable et n’utilise aucune bibliothèque.
# code to convert netmask ip to cidr number
def netmask_to_cidr(netmask):
'''
:param netmask: netmask ip addr (eg: 255.255.255.0)
:return: equivalent cidr number to given netmask ip (eg: 24)
'''
return sum([bin(int(x)).count('1') for x in netmask.split('.')])
Celui-ci, ça va? Il n'a pas non plus besoin de bibliothèque supplémentaire.
def translate_netmask_cidr(netmask):
"""
Translate IP netmask to CIDR notation.
:param netmask:
:return: CIDR netmask as string
"""
netmask_octets = netmask.split('.')
negative_offset = 0
for octet in reversed(netmask_octets):
binary = format(int(octet), '08b')
for char in reversed(binary):
if char == '1':
break
negative_offset += 1
return '/{0}'.format(32-negative_offset)
À certains égards, il ressemble à l'approche de IAmSurajBobade, mais la recherche est inversée. Il représente la façon dont je ferais la conversion manuellement au stylo et au papier.
À partir de Python 3.5:
ip4 = ipaddress.IPv4Network((0,'255.255.255.0'))
print(ip4.prefixlen)
print(ip4.with_prefixlen)
imprimera:
24
0.0.0.0/24