元进Python(3)---如何实现IP子网掩码计算器功能?

【最终呈现结果】

输入IP地址和掩码,就可以计算出网络段地址、主机地址范围以及广播地址。

【详细代码实现以及注释】

import re
#引入正则表达式模块

IPAddr='162.31.233.69'
IPMask='17'
#输入IP地址和子网掩码,可以用input,让用户输入

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地址统一转换成四位二进制形式的数列,最后用空字符串拼接成一个整体

def Masker(mask,NetorHost):

    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))

Masker(int(IPMask),0) #网络地址,就是说主机部分等于0
Masker(int(IPMask),1) #主机地址,就是说主机部分不为0
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值