识别有效的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的个数,之间以空格隔开。

输入例子:
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,mask用"~"分开,在对ip,mask用"."分开,存在4个数组中,并转化为int,
    先判断mask是否合法,若合法,再对ip进行分类
import java.util.Scanner;

public class Main {
    private static int a=0;
    private static int b=0;
    private static int c=0;
    private static int d=0;
    private static int e=0;
    private static int error=0;
    private static int p=0;
    
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String str=sc.nextLine();
            String[] array=str.split("~");
            String ip=array[0];
            String mask=array[1];
            getInfo(ip,mask);
        }
//        sc.close();
        System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+error+" "+p);
    }
    
    public static void getInfo(String ip,String mask){
        String[] ipArr=ip.split("\\.");
        String[] maskArr=mask.split("\\.");
        if(ipArr.length!=4||maskArr.length!=4){
            error++;
            return;
        }
        int[] ipInt=new int[4];
        int[] maskInt=new int[4];
        for(int i=0;i<4;i++){
            if(ipArr[i].equals(" ")||maskArr[i].equals(" ")){
                error++;
                return;
            }
            ipInt[i]=Integer.parseInt(ipArr[i]);
            maskInt[i]=Integer.parseInt(maskArr[i]);
            if(ipInt[i]>255||maskInt[i]>255){
                error++;
                return;
            }
        }
        if(checkIpMask(ipInt,maskInt)){
            int ipInt0=ipInt[0];
            int ipInt1=ipInt[1];
            if(ipInt0>=1&&ipInt0<=126){
                a++;
                if(ipInt0==10)
                    p++;
            }else if(ipInt0>=128&&ipInt0<=191){
                b++;
                if(ipInt0==172&&ipInt1>=16&&ipInt1<=31)
                    p++;
            }else if(ipInt0>=192&&ipInt0<=223){
                c++;
                if(ipInt0==192&&ipInt1==168)
                    p++;
            }else if(ipInt0>=224&&ipInt0<=239){
                d++;
            }else if(ipInt0>=240&&ipInt0<=255){
                e++;
            }
        }
    }
    
    public static boolean checkIpMask(int[] ipInt,int[] maskInt){
        if(checkMask(maskInt)==false){
            error++;
            return false;
        }
        return true;
    }
    
    public static boolean checkMask(int[] maskInt){
        String s="";
        for(int i=0;i<4;i++){
            String str=Integer.toBinaryString(maskInt[i]);
            int pad=8-str.length();
            if(str.length()<8){
                for(int j=0;j<pad;j++){
                    str="0"+str;
                }
            }
            s+=str;
        }
        int index=s.indexOf("0");
        String temp=s.substring(index+1);
        if(temp.contains("1")){
            return false;
        }else{
            return true;
        }
    }
}

 思路2:分别写判断ip。判断mask,判断私有地址的函数,对字符串处理以后,根据判断函数,计算各个数目

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static boolean judgeIP(String sIP){
        Pattern pattern=Pattern.compile("^(\\d{1,})\\.(\\d{1,})\\.(\\d{1,})\\.(\\d{1,})$");
        Matcher match=pattern.matcher(sIP);
        if(match.matches()){
            String[] str=sIP.split("\\.");
            for(String s:str){
                int n=Integer.parseInt(s);
                if(n<0||n>255)
                    return false;
            }
            return true;
        }else
            return false;
    }
    
    public static boolean judgeMask(String sMask){
        String[] str=sMask.split("\\.");
        StringBuffer sb=new StringBuffer();
        for(String s:str){
            String temp=Integer.toBinaryString(Integer.parseInt(s));
            while(temp.length()!=8){
                temp="0"+temp;
            }
            sb.append(temp);
        }
        String binaryString=sb.toString();
        int index0=binaryString.indexOf("0");
        if(index0==0)
            return false;
        if(binaryString.matches("^1{1,}"))
            return false;
        String[] str2=binaryString.split("0");
        if(str2.length==1){
            return true;
        }
        return false;
    }
    
    public static boolean judgePrivateIP(String ip){
        String[] str=ip.split("\\.");
        int A=Integer.parseInt(str[0]);
        int B=Integer.parseInt(str[1]);
        int C=Integer.parseInt(str[2]);
        int D=Integer.parseInt(str[3]);
        if(A==10)
            return true;
        if(A==172){
            if(B>=16&&B<=31)
                return true;
        }            
        if(A==192&&B==168)
            return true;
        return false;
    }
    
    public static void main(String[] args) {
        int a=0;
        int b=0;
        int c=0;
        int d=0;
        int e=0;
        int errorIpMask=0;
        int privateIp=0;
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String str=sc.next();
            String[] s1=str.split("~");
            String ip=s1[0];
            String mask=s1[1];
            if(!judgeIP(ip)||!judgeMask(mask)){
                errorIpMask++;
                continue;
            }
            
            String firstStr=ip.substring(0,ip.indexOf("."));
            int num=Integer.parseInt(firstStr);
            if(num>=1&&num<=126){
                a++;
            }else if(num>=128&&num<=191){
                b++;
            }else if(num>=192&&num<=223){
                c++;
            }else if(num>=224&&num<=239){
                d++;
            }else if(num>=240&&num<=255){
                e++;
            }
            
            if(judgePrivateIP(ip)){
                privateIp++;
            }
//            System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+errorIpMask+" "+privateIp);
        }
        sc.close();
        System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+errorIpMask+" "+privateIp);
        
    }
}

 

posted @ 2017-04-19 18:04  临江仙zhe  阅读(291)  评论(0)    收藏  举报