您的位置:

全面了解ipaddr——Python IP地址库

一、ipaddr简介

ipaddr是一款基于Python编写的IP地址库,提供了对IP地址的各种操作。它具有丰富的功能,包括但不限于以下几个方面:

  • IP地址验证
  • IP地址转换
  • IP地址枚举
  • IP地址归类
  • IP地址操作

二、IP地址验证

ipaddr可以对IP地址进行验证,可以判断输入的IP地址是否符合有效IP地址的格式,并且可以判断输入的IP地址是否是私有IP地址、受保留IP地址、IP地址段等等。示例如下:


import ipaddr

# 判断是否是IPv4的有效地址
print(ipaddr.IPv4Address('192.168.1.1').is_valid())
# 输出为True

# 判断是否是IPv4的私有地址
print(ipaddr.IPv4Address('192.168.1.1').is_private())
# 输出为True

# 判断是否是IPv4的受保留地址
print(ipaddr.IPv4Address('240.0.0.1').is_reserved())
# 输出为True

三、IP地址转换

ipaddr可以将IP地址转换成二进制、十进制、十六进制等等不同的格式,并且也可以将不同进制的IP地址相互转换。示例如下:


import ipaddr

# 将IPv4地址转换成二进制形式
print(ipaddr.IPv4Address('192.168.1.1').binary)
# 输出为:b'11000000101010000000000100000001'

# 将IPv4地址转换成十六进制形式
print(ipaddr.IPv4Address('192.168.1.1').hex)
# 输出为:c0a80101

# 将IPv4地址转换成十进制形式
print(int(ipaddr.IPv4Address('192.168.1.1')))
# 输出为:3232235777

# 将二进制形式的IPv4地址转换成十进制形式
print(int(ipaddr.IPv4Address('11000000101010000000000100000001'), 2))
# 输出为:3232235777

# 将十六进制形式的IPv4地址转换成十进制形式
print(int(ipaddr.IPv4Address('c0a80101'), 16))
# 输出为:3232235777

四、IP地址枚举

ipaddr可以对指定的IP地址段进行枚举,可以枚举出该IP地址段内的所有IP地址,也支持将IP地址段等分成若干段,并对每个子段进行枚举。示例如下:


import ipaddr

# 枚举IPv4地址段内的所有IP地址
for ip in ipaddr.IPv4Network('192.168.1.0/24'):
    print(str(ip))
# 输出为:
# 192.168.1.0
# 192.168.1.1
# 192.168.1.2
# ...
# 192.168.1.254
# 192.168.1.255

# 将IPv4地址段分成4个子段,并枚举每个子段的IP地址
for subnet in ipaddr.IPv4Network('192.168.1.0/24').subnet(4):
    for ip in subnet:
        print(str(ip))
    print('----')
# 输出为:
# 192.168.1.0
# 192.168.1.1
# 192.168.1.2
# 192.168.1.3
# ----
# 192.168.1.4
# 192.168.1.5
# 192.168.1.6
# 192.168.1.7
# ----
# 192.168.1.8
# ...

五、IP地址归类

ipaddr可以将IP地址归类,即将一个IP地址划分到指定的地址块内。比如,可以将IPv4地址归类到广域网地址、私有地址、回环地址等几类中。示例如下:


import ipaddr

# 将IPv4地址归类到广域网地址、私有地址、回环地址、链路地址、组播地址、保留地址等6类中
ip = ipaddr.IPv4Address('192.168.1.1')
print([ip in subnet for subnet in ipaddr.IPv4Network('0.0.0.0/0').subnet_of_length(8)])
# 输出为:
# [True, True, True, False, False, True]

# 将IPv6地址归类到保留地址、链路本地地址、唯一本地地址、组播地址、互联网地址、无法识别地址等6类中
ip = ipaddr.IPv6Address('2001:db8::1234')
print([ip in subnet for subnet in ipaddr.IPv6Network('::/0').subnet_of_length(8)])
# 输出为:
# [True, False, False, False, True, True]

六、IP地址操作

ipaddr还可以对IP地址进行运算,包括但不限于取反、二进制与、二进制或等操作。示例如下:


import ipaddr

# 对IPv4地址进行取反操作
ip = ipaddr.IPv4Address('192.168.1.1')
print(~ip)
# 输出为:IPv4Address('63.87.254.254')

# 对IPv6地址进行与操作
ip1 = ipaddr.IPv6Address('2001:db8::1234')
ip2 = ipaddr.IPv6Address('2001:db8::4321')
print(ip1 & ip2)
# 输出为:IPv6Address('2001:db8::')

# 对IPv6地址进行或操作
print(ip1 | ip2)
# 输出为:IPv6Address('2001:db8::5325')