美文网首页
IP地址转化为二进制字符串

IP地址转化为二进制字符串

作者: 环球探测 | 来源:发表于2016-04-17 15:31 被阅读1117次

    最近研究微软的算法试题,有一道题目是IP防火墙匹配相关的,计算的时候需要将IP地址转换成32位的二进制。这里给出一个自己写的方法。
    Java
    public String ip2BinStr(String ip) {
    String[] arr = ip.split("\.");
    String rs = "";
    for (String str : arr) {
    String s = Integer.toBinaryString(Integer.parseInt(str));
    if (s.length() < 8) {
    int diff = 8-s.length();
    for (int i = 0; i < diff; i++) {
    s = "0" + s;
    }
    }
    rs += s;
    }
    return rs;
    }

    这里int转化为二进制String的时候无法指定长度,导致还要进行前面补0的操作。写的过程中将Java中内置类型的toBinaryString()方法学习了下,这里写个笔记。
    直接在源码上添加注释,在Integer类中,有方法如下
    ```Java```
    public static String toBinaryString(int i) {
        return toUnsignedString0(i, 1);
    }
    
    /** 
    * 将一个整数val变为无符号表示, shift表示进制以2为底的对数,比如,
    * 1代表转成二进制,3代表8进制,4代表16进制。
    */
    private static String toUnsignedString0(int val, int shift) {
        // assert shift > 0 && shift <=5 : "Illegal shift value";
        // Integer.SIZE=32,  
        // Integer.numberOfLeadingZeros返回整数的二进制表示左边有多少个连续的0,比如1是31个,2是30个
        int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
        //chars是获取转换后的字符串长度,我还不造为什么是这么算。。。
        int chars = Math.max(((mag + (shift - 1)) / shift), 1);
        char[] buf = new char[chars];
        //调用下面的那个函数填充buf
        formatUnsignedInt(val, shift, buf, 0, chars);
        // 调用String构造函数将char数组转换成String,看了String源码,发现这个true代表是否共享缓存的值吧。暂时不支持设置为false。。。
        return new String(buf, true);
    }
    
        /**
         * 将val(视作无符号的类型)格式化到char数组buf中
         * offset 表示从buf的offset开始填充
         * len 表示一共写多少个char
         * 返回最低位,调用的时候并没有用到返回值
         */
    static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
          int charPos = len;
          int radix = 1 << shift;
          int mask = radix - 1;
          do {
                buf[offset + --charPos] = Integer.digits[val & mask];
                val >>>= shift;
          } while (val != 0 && charPos > 0);
    
          return charPos;
    }
    
    

    相关文章

      网友评论

          本文标题:IP地址转化为二进制字符串

          本文链接:https://www.haomeiwen.com/subject/kkyolttx.html