当前位置:  编程技术>java/j2ee

Java输出通过InetAddress获得的IP地址数组详细解析

    来源: 互联网  发布时间:2014-10-27

    本文导语:  使用 InetAddress 获取 IP 地址会得到一个 byte 数组如果你直接输出这个数组,你会发现 IP 地址中的某些位变成了负数比如 61.135.169.105 会输出成 61.-121.-87.105仔细看一看,会发现 135 + 121 = 256,169 + 87 = 256-_-! 怎么个情况!我首先想到...

使用 InetAddress 获取 IP 地址会得到一个 byte 数组
如果你直接输出这个数组,你会发现 IP 地址中的某些位变成了负数
比如 61.135.169.105 会输出成 61.-121.-87.105
仔细看一看,会发现 135 + 121 = 256,169 + 87 = 256

-_-! 怎么个情况!

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

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

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

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 不变。

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

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

代码如下:

/**
 * 将整型变量的二进制编码形式输出
 * @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(" ");
  }
 }
 return sb.toString();
}

    
 
 

您可能感兴趣的文章:

  • 在我的java程序中,我从数据库中得到一批数据,不能确定是多少个,我要把它保存到我的java数组中,可是怎样才能向C++中的数组一样可以自由分配空间,在java中我必需预先指定大小,不会一定要用java中的那个可改变数组大小的类吧?
  • java中如何实现二维(多维)动态数组.谢谢
  • java二维数组问题
  • 请问再java中怎样定义动态数组?
  • 高分求教:java特大数组
  • 请问Java中的二维数组声明问题
  • Java中如何比较两个数组中元素是否相同
  • 如何用jacob包,从Java和com之间传递二维数组?
  • 怎样取得java中数组的长度
  • java 里面怎么加入安全数组
  • java中如何得到byte数组中实际数值的长度??
  • java能否动态开辟string数组?
  • 怎样才能用java实现结构体数组,最好有代码!谢了!送上100分!!!!
  • 关于java里面的数组! 在线等!!!
  • **超级简单问题**请问java如何定义数组?
  • java从输入流中获取数据并返回字节数组示例
  • 如何知道java数组的长度
  • 请教:怎样传java数组?
  • java的数组的绝对值如何写啊?
  • JAVA 数组问题,TOO easy!
  • java命名空间java.net类inetaddress的类成员方法: isanylocaladdress定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: isloopbackaddress定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: islinklocaladdress定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: issitelocaladdress定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: ismulticastaddress定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: getaddress定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: getbyaddress定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: getlocalhost定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: gethostaddress定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: equals定义及介绍
  • java命名空间java.net类inetaddress的类成员方法: ismcglobal定义及介绍
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问在JAVa中如何输出引号
  • Java中如何比较两个数组中元素是否相同 iis7站长之家
  • 如何让java的编译时的错误信息或输出的结果信息显示在指定的窗口中
  • 开发android应用程序时,用java调用so库输出日志问题
  • java程序在linux系统下中文输出乱码,输出一个汉字对应一个问号
  • java问题,请问有没有控制输出小数点后两位的函数?
  • 请问在Java中如何设置自动完成花括号输出
  • java bean里char str[10];str="abcd";可输出"abcd ",如何去掉后面的空格
  • java菜鸟提问,一个简单得不得了的,不能再简单的输出问题!!!!
  • (详见内容)Java如何在Dos窗口的同一行中刷新输出不同的字符串?
  • java.net.URLConnection中getOutputStream()方法出现协议不支持输出流的错误,请问为何会出现此错误?
  • java控制台输出百分比进度条示例
  • 请问Java中如何在控制台一行内输入n个数字,然后再在一行内输出这些数字
  • java使用for循环输出杨辉三角
  • Java利用for循环输出空心菱形的实例代码
  • 为什么使用cat输出的文本文件是中文的,使用java从文件读取出来时显示的是乱码?
  • java控制台输出数字金字塔示例分享
  • JSP中调用Java Bean,为什么Bean中不能输出?
  • Java输出系统当前的日期(年月日时分秒毫秒)
  • 我是JAVA的初学者,请问如何将输入的INT或LONG型的数据按位数输出???
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3