使用 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();
- }
相关推荐
当你通过`InetAddress`获取IP地址时,返回的结果通常是一个`InetAddress`对象,但如果你需要处理IP地址的原始字节表示,你可以调用`getAddress()`方法,它会返回一个`byte[]`数组。然而,直接输出这个数组可能会遇到...
在Java编程中,判断一个IP地址是内网IP(私有IP)还是公网IP(全局IP)是一项常见的任务,尤其在网络编程和服务器配置中。内网IP通常用于局域网内部通信,而公网IP则是互联网上的唯一标识。下面将详细探讨如何实现这...
3. **IP地址操作**:Java的`java.net`包提供了`InetAddress`类,可以用来处理IP地址的转换和比较。在查询过程中,`IPSeeker`可能需要将输入的IP字符串转换为`InetAddress`对象,并与数据库中的IP范围进行比较。 4. ...
当我们要传输IP地址数组时,我们需要将每个IP地址转换为字节数组,然后将这些数组组合成一个大数组,以便通过TCP连接发送。 数组的存储和传输是网络编程中的关键环节。在Java中,数组是一种特殊的对象,可以通过...
`java.net.InetAddress`类是Java提供的用于处理IP地址的核心类。它可以用来获取与主机名相关的IP地址,或者验证IP地址的有效性。在扫描IP时,该类扮演了关键角色。 3. **ArrayList类**: `java.util.ArrayList`是...
InetAddress类在Java中扮演着核心角色,它使得开发者可以通过主机名或IP地址获取网络节点的信息。它隐藏了IP地址的数字形式,使得编程更加简洁易懂。 2. **工厂方法**: - `getLocalHost()`:此方法返回代表本地...
总的来说,Java的`InetAddress`类提供了强大的工具,允许开发者通过IP地址获取域名和主机名,从而实现网络通信中的重要功能。理解并熟练运用这些方法是成为一名合格的Java网络编程者的基础。在实际项目中,还需要...
5. IP地址转换:Java提供了一些方法将IP地址转换为字节数组,反之亦然。例如,`InetAddress`的`getAddress()`方法返回一个字节数组,而`InetAddress.getByAddress(byte[] addr)`可以根据字节数组创建`InetAddress`...
除了使用`getLocalHost()`,也可以通过`InetAddress.getByAddress(byte[] addr)`来创建一个`InetAddress`对象,传入预先知道的IP地址字节数组。这种方法适用于已知IP地址的情况下。 在分布式系统中,`InetAddress`...
在上述示例中,我们通过循环遍历`InetAddress`数组并打印每个IP地址。 7. 最后,`getServerIP()`方法返回的IP地址数组的长度可以指示该域名解析到的IP地址的数量,这在统计或处理多个IP地址的场景中非常有用。 ...
- `InetAddress.getAllByName(String host)`:传入主机名,返回该主机名对应的InetAddress对象数组,可以获取到所有网络接口的IP地址。 4. **排除环回地址**:由于`InetAddress.getLocalHost()`通常返回环回地址,...
通过`InetAddress`类,我们可以获取到本地主机的IP地址。`InetAddress.getLocalHost()`方法返回与本地主机相关的`InetAddress`对象,包含了主机名和IP地址。 2. **获取IP地址**:`InetAddress`对象提供了`...
- `InetAddress.getAddress()`:返回IP地址的字节数组。 - `InetAddress.getHostAddress()`:返回字符串形式的IP地址。 4. **第三方库**: Java标准库本身并不提供解析IP到省市区运营商的功能。通常需要借助第三...
而主机名是人易读的字符串,如"example.com",它与IP地址通过DNS(Domain Name System)系统关联,使得我们可以通过主机名访问网站。 在Java中,`java.net`包提供了获取本机IP和主机名的方法。以下是关键的类和方法...
- **通过IP地址获取`InetAddress`实例**:`getByAddress(byte[] address)` 方法允许通过IP地址的字节数组形式创建`InetAddress`对象。 - 示例代码: ```java byte[] ipBytes = {(byte)192, (byte)168, (byte)1, ...
例如,通过`InetAddress.getByName(String host)`方法可以将IP地址字符串(IPv4或IPv6)转换为`InetAddress`对象,而`InetAddress.getAddress()`则可以返回对应的字节数组表示IP地址。 其次,如果`ip.data`是这个库...
在Java中,可以使用`java.net.InetAddress`类进行IP地址的解析和转换。 - 对于IP地址范围,需要将其转换为整数进行比较。可以使用`InetAddress`的`getByAddress()`方法将IP字符串转换为字节数组,再转换为整数。 3...
### 知识点:网络编程中的InetAddress类使用方法 ...`InetAddress`类在Java网络编程中非常重要,它提供了获取和处理IP地址的功能。通过学习上述方法和示例,可以更好地理解和掌握如何在实际项目中应用这些功能。
本文将详细讲解如何通过Java代码来获取本机正在使用的IP地址(包括IPv4和IPv6)以及MAC地址,并排除虚拟机的IP。 首先,我们需要了解一点基础知识。IP地址是互联网上设备的唯一标识,分为IPv4和IPv6两种类型。IPv4...