18 识别有效的ip地址和子网掩码

该文主要介绍如何解析并分类IP地址及子网掩码,涉及A、B、C、D、E五类地址的范围,以及私网IP的界定,并提供了输入输出示例。

题目描述
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
A类地址1.0.0.0~126.255.255.255;
B类地址128.0.0.0~191.255.255.255;
C类地址192.0.0.0~223.255.255.255;
D类地址224.0.0.0~239.255.255.255;
E类地址240.0.0.0~255.255.255.255
私网IP范围是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
子网掩码为前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
本题暂时默认以0开头的IP地址是合法的,比如0.1.1.2,是合法地址
输入描述:
多行字符串。每行一个IP地址和掩码,用~隔开。
输出描述:
统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。
示例1
输入
10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19…0.~255.255.255.0
输出
1 0 1 0 0 2 1

思路:1.判断合法ip:长度为4,每一位0~255
2.判断合法子网掩码:长度为4,前面为连续的1,后面全是0
3.判断A\B\C\D\E类和私有类

import sys
def checkip(ip):
    if len(ip) != 4 and '' in ip:
        return False
    else:
        for i in range(4):  # 判断每一个.分割的是否为0~255
            if int(ip[i]) < 0 or int(ip[i]) > 255:
                return False
            else:  # 都满足返回True
                return True
list = ['254', '252', '248', '240', '224', '192', '128', '0']  # 8位,末尾逐步为0的数
def checkmask(ms):
    if len(ms) != 4:  # 先判断长度
        return False
    if ms[0] == '255':
        if ms[1] == '255':
            if ms[2] == '255':
                if ms[3] in list:  # 第四个开始出现0
                    return True
                else:
                    return False
            elif ms[2] in list and ms[3] == '0':  # 第三个开始出现0,第四个必须为0
                return True
            else:
                return False
        elif ms[1] in list and ms[2] == '0' and ms[3] == '0':
            return True
        else:
            return False
    elif ms[0] in list and ms[1] == '0' and ms[2] == '0' and ms[3] == '0':
        return True
    else:
        return False
A=0
B = 0
C = 0
D = 0
E = 0
err = 0
private = 0
while True:
    string=sys.stdin.readline().strip()
    if string=='':
        break
    ipstr,msstr=string.split('~')
    iplist = ipstr.split('.')
    mslist = msstr.split('.')
    if checkip(iplist) and checkmask(mslist):
        if 1<=int(iplist[0])<=126:
            A+=1
        if 128<=int(iplist[0])<=191:
            B+=1
        if 192<=int(iplist[0])<=223:
            C+=1
        if 224 <= int(iplist[0]) <= 239:
            D += 1
        if 240 <= int(iplist[0]) <= 255:
            E += 1
        if int(iplist[0])==10 or (int(iplist[0])==172 and 16<=int(iplist[1])<=31) or (int(iplist[0])==192 and int(iplist[1])==168):
            private+=1
    else:
        err+=1
print(A,B,C,D,E,err,private)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值