`
shinepaopao
  • 浏览: 145214 次
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多

使用 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,这样一来便将符号扩展的那些高位清除掉了。

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


 

Java代码 
  1. /** 
  2.   * 将整型变量的二进制编码形式输出 
  3.   * @param n 整型变量 
  4.   * @param size 整型的二进制长度,可使用类似 Short.SIZE 获得 
  5.   * @return 二进制编码字符串 
  6.   */  
  7.   public static String printBinary(long n, int size) {  
  8.           StringBuilder sb = new StringBuilder();  
  9.           for (int i = size - 1; i >= 0; i--) {  
  10.                sb.append(n >>> i & 0x01);  
  11.                if (i % 4 == 0) {  
  12.                  sb.append(" ");  
  13.                }  
  14.            }  
  15.           return sb.toString();  
  16.   }  

 

9
20
分享到:
评论
3 楼 hw1986232 2013-10-10  
.......35的二进制编码是1000 0111嘛?。。。。楼主这个错误有点明显啊。我还正看得纳闷呢。。。135才是1000 0111吧,超出128的范围了
2 楼 longshaojian 2013-10-10  
顶楼上。。
1 楼 xglv2013 2013-10-10  
挺不错的知识,搞不懂那些踩的人是什么心理,觉得这个有错误?还是不值得被看到?

相关推荐

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

    当你通过`InetAddress`获取IP地址时,返回的结果通常是一个`InetAddress`对象,但如果你需要处理IP地址的原始字节表示,你可以调用`getAddress()`方法,它会返回一个`byte[]`数组。然而,直接输出这个数组可能会遇到...

    java判断是内网ip还是公网ip

    在Java编程中,判断一个IP地址是内网IP(私有IP)还是公网IP(全局IP)是一项常见的任务,尤其在网络编程和服务器配置中。内网IP通常用于局域网内部通信,而公网IP则是互联网上的唯一标识。下面将详细探讨如何实现这...

    Java读取纯真IP数据库定位IP地址(eclipse中直接使用)_项目源码

    3. **IP地址操作**:Java的`java.net`包提供了`InetAddress`类,可以用来处理IP地址的转换和比较。在查询过程中,`IPSeeker`可能需要将输入的IP字符串转换为`InetAddress`对象,并与数据库中的IP范围进行比较。 4. ...

    Array_input.zip_array ip_tcp传输数组

    当我们要传输IP地址数组时,我们需要将每个IP地址转换为字节数组,然后将这些数组组合成一个大数组,以便通过TCP连接发送。 数组的存储和传输是网络编程中的关键环节。在Java中,数组是一种特殊的对象,可以通过...

    java线程扫描ip地址

    `java.net.InetAddress`类是Java提供的用于处理IP地址的核心类。它可以用来获取与主机名相关的IP地址,或者验证IP地址的有效性。在扫描IP时,该类扮演了关键角色。 3. **ArrayList类**: `java.util.ArrayList`是...

    通过IP地址获得域名和主机名

    总的来说,Java的`InetAddress`类提供了强大的工具,允许开发者通过IP地址获取域名和主机名,从而实现网络通信中的重要功能。理解并熟练运用这些方法是成为一名合格的Java网络编程者的基础。在实际项目中,还需要...

    java ip 地址分析

    5. IP地址转换:Java提供了一些方法将IP地址转换为字节数组,反之亦然。例如,`InetAddress`的`getAddress()`方法返回一个字节数组,而`InetAddress.getByAddress(byte[] addr)`可以根据字节数组创建`InetAddress`...

    InetAddress源码

    除了使用`getLocalHost()`,也可以通过`InetAddress.getByAddress(byte[] addr)`来创建一个`InetAddress`对象,传入预先知道的IP地址字节数组。这种方法适用于已知IP地址的情况下。 在分布式系统中,`InetAddress`...

    JAVA获得域名IP地址的方法

    在上述示例中,我们通过循环遍历`InetAddress`数组并打印每个IP地址。 7. 最后,`getServerIP()`方法返回的IP地址数组的长度可以指示该域名解析到的IP地址的数量,这在统计或处理多个IP地址的场景中非常有用。 ...

    getlocalIp_获取本地IP工具java_服务器_

    - `InetAddress.getAllByName(String host)`:传入主机名,返回该主机名对应的InetAddress对象数组,可以获取到所有网络接口的IP地址。 4. **排除环回地址**:由于`InetAddress.getLocalHost()`通常返回环回地址,...

    Java 自动获取本机IP、MAC地址

    通过`InetAddress`类,我们可以获取到本地主机的IP地址。`InetAddress.getLocalHost()`方法返回与本地主机相关的`InetAddress`对象,包含了主机名和IP地址。 2. **获取IP地址**:`InetAddress`对象提供了`...

    java ip地址解析省市区运营商

    - `InetAddress.getAddress()`:返回IP地址的字节数组。 - `InetAddress.getHostAddress()`:返回字符串形式的IP地址。 4. **第三方库**: Java标准库本身并不提供解析IP到省市区运营商的功能。通常需要借助第三...

    Java 实例 - 获取本机ip地址及主机名源代码+详细指导教程.zip

    而主机名是人易读的字符串,如"example.com",它与IP地址通过DNS(Domain Name System)系统关联,使得我们可以通过主机名访问网站。 在Java中,`java.net`包提供了获取本机IP和主机名的方法。以下是关键的类和方法...

    InetAddress和URL

    - **通过IP地址获取`InetAddress`实例**:`getByAddress(byte[] address)` 方法允许通过IP地址的字节数组形式创建`InetAddress`对象。 - 示例代码: ```java byte[] ipBytes = {(byte)192, (byte)168, (byte)1, ...

    java IP库实现

    例如,通过`InetAddress.getByName(String host)`方法可以将IP地址字符串(IPv4或IPv6)转换为`InetAddress`对象,而`InetAddress.getAddress()`则可以返回对应的字节数组表示IP地址。 其次,如果`ip.data`是这个库...

    Java 版本 IP 数据库查询

    在Java中,可以使用`java.net.InetAddress`类进行IP地址的解析和转换。 - 对于IP地址范围,需要将其转换为整数进行比较。可以使用`InetAddress`的`getByAddress()`方法将IP字符串转换为字节数组,再转换为整数。 3...

    网络编程 InetAddress 的使用

    ### 知识点:网络编程中的InetAddress类使用方法 ...`InetAddress`类在Java网络编程中非常重要,它提供了获取和处理IP地址的功能。通过学习上述方法和示例,可以更好地理解和掌握如何在实际项目中应用这些功能。

    java拿取本机正在使用的ip及本机mac地址

    本文将详细讲解如何通过Java代码来获取本机正在使用的IP地址(包括IPv4和IPv6)以及MAC地址,并排除虚拟机的IP。 首先,我们需要了解一点基础知识。IP地址是互联网上设备的唯一标识,分为IPv4和IPv6两种类型。IPv4...

    Java网络编程基础.doc

    在Java中,网络编程主要涉及套接字(Socket)和服务器套接字(ServerSocket)类,以及用于处理IP地址的InetAddress类。InetAddress类是Java提供的一种机制,用于封装IPv4和IPv6地址,它有两个子类:Inet4Address和...

Global site tag (gtag.js) - Google Analytics