web-dev-qa-db-ja.com

netaddrを使用してPythonでサブネットマスクをcidrに変換する方法

netaddrライブラリを使用してipv4サブネットマスクをcidr表記に変換するにはどうすればよいですか?
例:255.255.255.0 to /24

10
Mik

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
23
Eugene Yarmash
>>> IPNetwork('0.0.0.0/255.255.255.0').prefixlen
24
4
Derek Chadwell

次の機能を使用します。高速で信頼性が高く、ライブラリを使用しません。

# 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
IAmSurajBobade

これはどう?追加のライブラリも必要ありません。

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のアプローチといくつかの点で似ていますが、代わりにルックアップが逆になります。これは、ペンと紙で手動で変換する方法を表しています。

0
kb-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

0
gerardw