Java中把十进制转为二进制(判断有效的ip地址和掩码)

Integer类中有静态方法:
toBinaryString(int i):返回int变量的二进制表示的字符串。
toHexString(int i):返回int变量的16进制字符串。
toOctalString(int i):返回int变量的8进制表示字符串。

判断有效的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就是一个非法的掩码)
注意二进制下全是1或者全是0均为非法

注意:
1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时可以忽略
2. 私有IP地址和A,B,C,D,E类地址是不冲突的
*/
/**
  * 1. Mask 255.255.255.255 , 0.0.0.0 为非法。
  * 2. IP和Mask必须同时正确,才能被分类到A, B, C, D, E以及私有。
  * 3. IP和Mask同时错误时,只算一次错误
  * 4. 注意0.*.*.*以及127.*.*.*不属于任何类别。
  */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int isA = 0;
        int isB = 0;
        int isC = 0;
        int isD = 0;
        int isE = 0;
        int isEroor = 0;
        int isPrivate = 0;

        while (sc.hasNextLine()) {
            String str = sc.nextLine();
            String[] ips = str.split("~");

            //判断掩码是否合法
            boolean isMask = false;
            String[] maskArr = ips[1].split("\\.");
            String binaryMask = "";
            //形成掩码二进制字符串
            for (int i = 0; i < maskArr.length; i++) {
                String binaryStr = Integer.toBinaryString(Integer.parseInt(maskArr[i]));
                //凑成4组8位二进制
                for (int j = 0; j < 8 - binaryStr.length(); j++) {
                    binaryStr = "0" + binaryStr;
                }
                binaryMask += binaryStr;
            }
            //比较二进制字符串中第一个0的位置和最后一个1的位置来判断掩码是否合法
            if (binaryMask.indexOf("0") < binaryMask.lastIndexOf("1")) {
                isMask = false;
            } else {
                isMask = true;
            }

            //掩码合法后再来判断IP是否合法
            if (isMask) {
                String[] strArr = ips[0].split("\\.");
                if (strArr.length == 4) {
                    int[] ipArr = new int[4];
                    for (int i = 0; i < 4; i++) {
                        if (strArr[i] == "") {
                            ipArr[i] = -1;
                        } else {
                            ipArr[i] = Integer.parseInt(strArr[i]);
                        }
                    }
                    if ((0 <= ipArr[0] && ipArr[0] <= 255) && (0 <= ipArr[1] && ipArr[1] <= 255) && (0 <= ipArr[2] && ipArr[2] <= 255) && (0 <= ipArr[3] && ipArr[3] <= 255)) {
                        if (ipArr[0] >= 1 && ipArr[0] <= 126) {
                            isA++;
                            if (ipArr[0] == 10)
                                isPrivate++;
                        } else if (ipArr[0] >= 128 && ipArr[0] <= 191) {
                            isB++;
                            if (ipArr[0] == 172 && (ipArr[1] >= 16 && ipArr[1] <= 31))
                                isPrivate++;
                        } else if (ipArr[0] >= 192 && ipArr[0] <= 223) {
                            isC++;
                            if (ipArr[0] == 192 && ipArr[1] == 168)
                                isPrivate++;
                        } else if (ipArr[0] >= 224 && ipArr[0] <= 239) {
                            isD++;
                        } else if (ipArr[0] >= 240 && ipArr[0] <= 255) {
                            isE++;
                        }
                    } else {
                        isEroor++;
                    }
                } else {
                    isEroor++;
                }

            } else {
                isEroor++;
            }
        }
        System.out.println(isA + " " + isB + " " + isC + " " + isD + " " + isE + " " + isEroor + " " + isPrivate);
        sc.close();
    }
}
posted @ 2021-03-14 17:42  白玉神驹  阅读(475)  评论(0编辑  收藏  举报