如何使用netaddr在Python中将子网掩码转换为cidr

时间:2016-06-28 20:19:27

标签: python cidr

如何使用netaddr库将ipv4子网掩码转换为cidr表示法?
示例:255.255.255.0 to /24

5 个答案:

答案 0 :(得分:21)

使用netaddr

>>> from netaddr import IPAddress
>>> IPAddress('255.255.255.0').netmask_bits()
24

使用stdlib中的ipaddress

>>> from ipaddress import IPv4Network
>>> IPv4Network('0.0.0.0/255.255.255.0').prefixlen
24

您也可以在不使用任何库的情况下执行此操作:只需在网络掩码的二进制表示中计算1位:

>>> netmask = '255.255.255.0'
>>> sum(bin(int(x)).count('1') for x in netmask.split('.'))
24

答案 1 :(得分:4)

>>> IPNetwork('0.0.0.0/255.255.255.0').prefixlen
24

答案 2 :(得分:3)

使用以下功能。它快速,可靠,不使用任何库。

# 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('.')])

答案 3 :(得分:0)

这个怎么样?它也不需要任何其他库。

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)

在某些方面它类似于IAmSurajBobade的方法,但是查找却相反。它表示我将通过笔和纸手动进行转换的方式。

答案 4 :(得分:0)

从Python 3.5开始:

ip4 = ipaddress.IPv4Network((0,'255.255.255.0'))
print(ip4.prefixlen)
print(ip4.with_prefixlen)

将打印:

  

24
  0.0.0.0/24