一、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')