将ip地址范围转换成通过掩码表示的形式,可以先将ip范围转换成单个ip,再计算掩码
一、python中实现将IP地址与整数类型之间的转换,有两种方法。
第一种方法:利用socket,struct模块
import socketimport structdef ip2num(ip):#将IP地址转换成整数,返回结果是一个元组(16843009,),通过下标[0]取出第一个值return struct.unpack("!L", socket.inet_aton(ip))[0]print(ip2num('1.1.1.1'))print(type(ip2num('1.1.1.1')))#16843009#<class 'int'>def num2ip(num):#将整数转换成IP地址,类型为字符串return socket.inet_ntoa(struct.pack("!L", num))print(num2ip(16843009))print(type(num2ip(16843009)))#1.1.1.1#<class 'str'>
第二种方法:利用ipaddress模块,ipaddress中有两种方式:
1、使用ipaddress中的IPv4Address和IPv6Address模块,可指定需要转换的IP地址类型,如果类型不匹配则会报错。
import ipaddressdef ip2num(ip):#将IP地址转换成整数类型return int(ipaddress.IPv4Address(ip))print(ip2num('1.1.1.1'))print(type(ip2num('1.1.1.1')))#16843009#<class 'int'>def num2ip(num):#将整数转换成IP地址return str(ipaddress.IPv4Address(num))print(num2ip(16843009))print(type(num2ip(16843009)))#1.1.1.1#<class 'str'>def num2ipv6(num):return str(ipaddress.IPv6Address(num))print(num2ipv6(33686018123141231234123123124124123412))#1957:b0eb:ffa4:5af4:7b46:e610:c5d6:114def ipv62num(ipv6):return int(ipaddress.IPv6Address(ipv6))print(ipv62num('1957:b0eb:ffa4:5af4:7b46:e610:c5d6:114'))#33686018123141231234123123124124123412
2、直接使用ipaddress中的ip_address模块,可以自动识别IP地址的类型,进行转换。
from ipaddress import ip_addressprint(int(ip_address('2.2.2.2')))#33686018print(str(ip_address(33686018)))#2.2.2.2print(int(ip_address('1957:b0eb:ffa4:5af4:7b46:e610:c5d6:114')))#33686018123141231234123123124124123412print(str(ip_address(33686018123141231234123123124124123412)))#1957:b0eb:ffa4:5af4:7b46:e610:c5d6:114
例子:将IP地址范围转换成单个IP
from ipaddress import ip_addressdef ips_range(ips_range):#以‘-’为分割符,识别出起始IP和终止IPip_start, ip_end = ips_range.split('-')#将起始IP和终止IP转换成整数ip_start_int = int(ip_address(ip_start))ip_end_int = int(ip_address(ip_end)) + 1return [str(ip_address(ip)) for ip in range(ip_start_int, ip_end_int)]ips_range_list = ips_range('1.1.1.251-1.1.2.5')print(ips_range_list)#['1.1.1.251', '1.1.1.252', '1.1.1.253', '1.1.1.254', '1.1.1.255', '1.1.2.0', '1.1.2.1', '1.1.2.2', '1.1.2.3', '1.1.2.4', '1.1.2.5']
3、列出IP网段中所有的IP地址
import ipaddressdef ip_network2ips(ips_network):#将ip网段的字符串类型转换成IPv4Network类型network = ipaddress.ip_network(ips_network, strict=False)#print(network, type(network))#1.1.1.0/29 <class 'ipaddress.IPv4Network'>#调用hosts()方法,将ip网段转换成单个ipreturn network.hosts()ips = ip_network2ips('1.1.1.1/29')for ip in ips:print(ip)# 1.1.1.1# 1.1.1.2# 1.1.1.3# 1.1.1.4# 1.1.1.5# 1.1.1.6
二、对所有单个ip进行汇总,计算是否在同一网段中,对同一网段中可汇总和ip地址通过计算子网掩码进行汇总表示
。。。
参考/3/howto/ipaddress.html#comparisons