1、利用ipaddress库去转换IP网段
import ipaddress
import threading
import re
#引入正则表达式模块
import os
import sys
#性能卡爆版
def cal_ip(ip_net):
try:
print(ip_net)
net = ipaddress.ip_network(ip_net, strict=False)
print('IP版本号: ' + str(net.version))
print('是否是私有地址: ' + str(net.is_private))
print('IP地址总数: ' + str(net.num_addresses))
print('可用IP地址总数: ' + str(len([x for x in net.hosts()])))
print('网络号: ' + str(net.network_address))
print('起始可用IP地址: ' + str([x for x in net.hosts()][0]))
print('最后可用IP地址: ' + str([x for x in net.hosts()][-1]))
print('可用IP地址范围: ' + str([x for x in net.hosts()][0]) + '-' + str([x for x in net.hosts()][-1]))
print('掩码地址: ' + str(net.netmask))
print('反掩码地址: ' + str(net.hostmask))
print('广播地址: ' + str(net.broadcast_address))
LineIP = str([x for x in net.hosts()][0]) + '-' + str([x for x in net.hosts()][-1])
line_IP.append(str([x for x in net.hosts()][0]) + '-' + str([x for x in net.hosts()][-1]) + '\n')
#ip_net = ""
#return ip_net
except ValueError:
print('您输入格式有误,请检查!')
if __name__ == '__main__':
line_IP = []
#读取文件获取IP与掩码
lines = open('ip_mask.txt','r').readlines() #打开文件,读入每一行
#print(lines)
#ip_net = '192.168.1.1/24'
#thread = threading.Thread(target=cal_ip)
#thread.start()
#thread.join()
for s in lines:
s = s.strip()
cal_ip(s)
with open("ip_mask_2.txt", mode='w', encoding='utf-8') as fp:
for f in line_IP:
fp.write(f) # write是写入
#fp.close() # 关闭文件
print("写入完成")
以上是利用python原有的ipaddress库文件去处理获取到的网络地址/掩码 得出的IP范围网段,可简化需要把客户提供网段写成网段形式。
2、采用算法去处理网段转换P网段
@Author liyixiang545@gmail.com
import re
#引入正则表达式模块
import os
import sys
#性能优化
line_IP_cache = []
line_IP = []
def Masker(mask,NetorHost):
global LastIP,FirstIP,line_IP
if NetorHost==0: #计算网络部分系列
MyNetworkt1=str(IP2[0:mask])+str(str(NetorHost)*(32-int(IPMask)))
print('第四步:' + str(MyNetworkt1))
#根据掩码位数把二进制IP整体主机部分全部置0,用来计算第一主机
FirstIPt1=str(IP2[0:mask])+str(str(NetorHost)*(32-int(IPMask)-1))+str(1)
#二进制第一主机IP
print('第五步:' + str(FirstIPt1))
MyNetwork2=[]
FirstIPt2=[]
i=0
while i<=3:
MyNetwork2.append(int(MyNetworkt1[i*8:(i+1)*8],2))
#把二进制形式网络段MyNetwork1分成四段,且转换为十进制形式。
FirstIPt2.append(int(FirstIPt1[i*8:(i+1)*8],2))
#把二进制形式第一主机分成四段,且转换为十进制形式。
i+=1
MyNetworkt3=str(MyNetwork2)[1:-1].replace(',','.')
#网络段改写成点分式,不是逗号分式。
MyNetwork=MyNetworkt3.replace(' ','')
#网络段进一步去掉空格
FirstIPt3=str(FirstIPt2)[1:-1].replace(',','.')
#第一主机改写成点分式,不是逗号分式。
FirstIP=FirstIPt3.replace(' ','')
#第一主机进一步去掉空格
print('第六步:网络地址 ' + str(MyNetwork))
print('第七步:第一主机 ' + str(FirstIP))
else: #计算主机部分系列
MyNetworkt1=str(IP2[0:mask])+str(str(NetorHost)*(32-int(IPMask)))
print('第八步:' + str(MyNetworkt1))
#广播地址的二进制形式
LastIPt1=str(IP2[0:mask])+str(str(NetorHost)*(32-int(IPMask)-1))+str(0)
#最后一个主机地址的二进制形式
print('第九步:' + str(LastIPt1))
MyNetwork2=[]
LastIPt2=[]
i=0
while i<=3:
MyNetwork2.append(int(MyNetworkt1[i*8:(i+1)*8],2))
#广播地址转换十进制
LastIPt2.append(int(LastIPt1[i*8:(i+1)*8],2))
#最后一个主机地址转换为十进制
i+=1
MyNetworkt3=str(MyNetwork2)[1:-1].replace(',','.')
#点分式
MyNetwork=MyNetworkt3.replace(' ','')
#去掉空格
LastIPt3=str(LastIPt2)[1:-1].replace(',','.')
LastIP=LastIPt3.replace(' ','')
print('第十步:最后主机 ' + str(LastIP))
print('十一步:广播地址 ' + str(MyNetwork))
lineIP = str(FirstIP+"-"+LastIP+"\n")
line_IP_cache.append(lineIP)
print("可用地址范围:",lineIP)
print("")
line_IP = line_IP_cache
#读取txt中每行数据,如192.168.1.0/24
lines = open('ip_mask.txt','r').readlines() #打开文件,读入每一行
print(lines)
j = 1
for s in lines :
print("正在处理第",j,"个")
s = s.strip()
if "/" in s[-2:]:
#print(s[-1:])
IPAddr=s[:-2]
IPMask=s[-1:]
print("IP :",s[:-2])# 输出处理的行数据,获取到IP网络号地址
print("MASK:",s[-1:])# 输出处理的行数据,获取到子网掩码
else:
IPAddr=s[:-3]
IPMask=s[-2:]
print("IP :",s[:-3])# 输出处理的行数据,获取到IP网络号地址
print("MASK:",s[-2:])# 输出处理的行数据,获取到子网掩码
#此处为赋值到IP变量
#处理数据
IP10L = re.findall(r'\d*', IPAddr) #用正则表达式挑出IP地址的四个十进制数
for x in IP10L:
IP10L.remove('')
print('第一步:'+str(IP10L))
#把IP地址转换为四位十进制数的数列
IP2L=[]
IP2=''
for x in IP10L:
#MyBin=str(bin(int(x))).strip('0b') #该方法容易误杀后面的0
MyBin = str(bin(int(x)))[2:]
MyZero='0'*(8-len(MyBin)) #前面需要补充0的位数
IP2L.append(str(MyZero)+(bin(int(x)))[2:])
for x in IP2L:
IP2=IP2+str(x)
print('第二步:'+str(IP2L))
print('第三步:'+str(IP2))
#把IP地址统一转换成四位二进制形式的数列,最后用空字符串拼接成一个整体
Masker(int(IPMask),0) #网络地址,就是说主机部分等于0
Masker(int(IPMask),1) #主机地址,就是说主机部分不为0
j = j + 1
with open("ip_mask_2.txt", mode='w', encoding='utf-8') as fp:
for f in line_IP:
fp.write(f) # write是写入
#fp.close() # 关闭文件
print("写入完成")
这第二种方式调用方法,执行后将返回的数据存入到ip_mask_2.txt文件中,没有涉及到线程、可用根据自己的想法加上去。
未标准化前
标准化后
python返回