当前位置 > 主页 > 万和大讲堂 >


Java输出通过InetAddress获得的IP地址数组

2016-02-26 14:26

  使用 InetAddress 获取 IP 地址会得到一个 byte 数组


  如果你直接输出这个数组,你会发现 IP 地址中的某些位变成了负数


  比如 61.135.169.105 会输出成 61.-121.-87.105


  仔细看一看,会发现 135 + 121 = 256,169 + 87 = 256


  -_-! 怎么个情况!南京Java软件培训


  我首先想到的是 byte 类型向 int 类型转换过程中出现了问题,后来发现,实际不然


  因为 Java 中没有 unsigned 类型,所以byte、short、int、long 都是有符号的,所以根本就不存在隐式类型转换出错的问题。


  既然说到了 Java 没有 unsigned 类型,那么 byte 是 8 位,所以表示范围为 -127 - 128,而 IP 一个段的表示范围为 0 - 255,终于找到了不对劲的地方了 南京Java软件培训


  IP 的一个段是一个 unsigned byte,这样一个 unsigned byte 存入一个 signed byte 中当然会导致一些问题出现


  分析一下:


  35 的二进制编码为 1000 0111,最高位置为 1


  由于 byte 被认为是 unsigned byte,所以最高位的 1 将会被解释为符号位,另外 Java 中存储是按照补码存储,所以 1000 0111 会被认为是补码形式,转换成原码便是 1111 0001,转换成十进制数便是 -121。


  再看,65 的二进制编码为 0100 0001,由于小于 128,所以没有将最高位置 1,0100 0001 的补码还是 0100 0001,所以 65 不变。南京Java软件培训


  分析这么多,这个问题的解决方法其实很简单,将 byte 变量与 0xFF 按位与即可,过程中 byte 会隐式类型转换为 int,当与 0xFF 按位与的时候,会将除了低 8 位的其他位全部置 0,这样一来便将符号扩展的那些高位清除掉了。


  最后附上一个自己写的通用函数,用来将整型变量的二进制编码输出


  /** 南京Java软件培训


  * 将整型变量的二进制编码形式输出


  * @param n 整型变量


  * @param size 整型的二进制长度,可使用类似 Short.SIZE 获得


  * @return 二进制编码字符串


  */


  public static String printBinary(long n, int size) {


  StringBuilder sb = new StringBuilder();


  for (int i = size - 1; i >= 0; i--) {


  sb.append(n >>> i & 0x01);


  if (i % 4 == 0) {


  sb.append(" ");南京Java软件培训


  }


  }


  return sb.toString();


  }


  江苏万和Java开发实训课程由5年以上软件项目开发经验的资深软件工程师、项目经理以及有着多年数据库管理经验的资深专家担纲授课,学员通过5个月的课程学习,可以掌握开发Java大型软件项目过程中所需要的软件技术、设计规范、开发流程、质量控制及项目管理,以及Oracle数据库相关知识内容。整个课程采用案例教学,授课与实践相结合,项目贯穿于各个阶段的课程当中,使学员能够学以致用。合格学员还可以获得由国际著名厂商Oracle公司所颁发的Oracle认证Java程序员(OCJP)、Oracle认证Web组件开发专家(OCWCD)、Oracle认证数据库管理员(OCA)等权威国际认证证书,合格学员保证100%就业。

最近开班 more>
  • Web前端开发
  • 软件测试
  • 软件测试预科班
  • AI大模型+全栈开发开班
  • 云原生精英班
  • 云网预科班
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第五期
  • Java全栈
  • CISP
  • HCIP-cloud
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCP 19C
  • RHCA
  • 6月9日
  • 5月21日
  • 5月14日
  • 6月9日
  • 5月7日
  • 5月26日
  • 5月19日
  • 5月12日
  • 6月3日
  • 6月9日
  • 随时开课
  • 7月12日
  • 5月19日
  • 5月19日
  • 5月7日
  • 5月10日
  • 5月24日
  • 5月24日
  • 随时开课
  • 随时开课
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入