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

最近研究微软的算法试题,有一道题目是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;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,644评论 2 56
  • 开发及环境搭建类面试题 1、描述软件产生内存泄露的原因以及检查方式。(可以结合一种开发语言进行描述) 参考答案: ...
    天宇逍遥heart阅读 1,389评论 0 1
  • 空气里是粘热的,电扇嘶嘶的响着,风也是热的。一切都等待一场大雨。 人一辈子是很漫长的,但听到熟悉的邻家...
    Yinwei_Liu阅读 188评论 0 0
  • _mTableView.tintColor=[UIColorredColor];
    李龙简书阅读 1,045评论 0 0