zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    devexpress LayoutControl控件里面的内边距的消除
    NPOI 单元格高度和宽度的值设置解释
    NPOI 设置合并后的单元格的边框的解决方法
    ajax中参数traditional的作用
    kendo ui 遇到问题 Invalid or unexpected token的原因和解决方法
    kendo ui grid重置功能,重置所有数据
    mysql 8.*版本部署上以后用navcat能连上,但是系统连不上
    mysql 5.7的my.ini的位置在隐藏文件夹“ProgramData”下面
    获取kendo treeView上的选中项
    mysql按30分钟进行分组
  • 原文地址:https://www.cnblogs.com/cgy-home/p/14533299.html
Copyright © 2011-2022 走看看