华为机试题-识别有效的Ip地址和掩码并分类Python实现

找个工作要会这个要会那个,真尼玛难…

从头开始吧,python以前没学过但是很看好,以后用的人越来越多,毕竟太容易上手了,咱也不能落伍了,拿华为机试题练手吧!

题目:

请解析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就是一个非法的掩码
 

输入描述:

多行字符串。每行一个IP地址和掩码,用~隔开。

输出描述:

统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。

 
思路:
这道题网上方法很多,题目也比较简单,我选取其中一种方法实现,
>>校验Ip是否合规;
>>校验掩码是否合规;
>>Ip与掩码均合规的情况下对Ip进行分类;
>>继续判断是否为私网Ip;
 
代码:
#!/usr/bin/python
# -*- coding: utf-8 -*
import sys
A=0
B=0
C=0
D=0
E=0
error=0
privateIp=0
lastcode=['254','252','248','240','224','192','128','0']
def CheckIp(ip):
    if len(ip) !=4 or '' in ip:
        return False
    else:
        for i in range(4):
            if int(ip[i]) < 0 or int(ip[i]) > 255:
                return False
            else:
                return True
def CheckMask(mask):
    if len(mask)!=4:
        return False
    else:
        if mask[0]=='255':
            if mask[1]=='255':
                if mask[2]=='255':
                    if mask[3] in lastcode:
                        return True
                    else:
                        return False
                elif mask[2] in lastcode and mask[3]=='0':
                     return True
                else:
                     return False
            elif mask[1] in lastcode and mask[2]==mask[3]=='0':
                return True
            else:
                return False
        elif mask[0] in lastcode and mask[1]==mask[2]==mask[3]=='0':
            return True
        else:
            return False
while True:
    Input= sys.stdin.readline().strip()
    if Input == '':
        break
    ipList=Input.split('~')[0]
    maskList=Input.split('~')[1]
    ip=ipList.split('.')
    mask=maskList.split('.')
    if CheckIp(ip) and CheckMask(mask):
        if 1<=int(ip[0])<=126:
            A+=1
        if 128<=int(ip[0])<=191:
            B+=1
        if 192<=int(ip[0])<=223:
            C+=1
        if 224<=int(ip[0])<=239:
            D+=1
        if 240<=int(ip[0])<=255:
            E+=1
        if int(ip[0])==10 or (int(ip[0])==172 and 16<=int(ip[1])<=31) or (int(ip[0])==192 and int(ip[1])==168):
            privateIp+=1
    else:
        error+=1
    print(Input)
print('{} {} {} {} {} {} {}'.format(A,B,C,D,E,privateIp,error))

总结:

新手上路,所以走了很多弯路,python函数、循环均没有{}大括号进行组织,所以如果你是像我一样习惯用c#或Java,那刚开始大概率我尼玛了,因为代码没对齐可能得出的结果会截然不同,所以多注意下吧,其他没什么了,反正感觉只要懂点英文都能写了…

猜你喜欢

转载自www.cnblogs.com/Alwaysblue/p/12173475.html