使用 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();
- }
相关推荐
由于byte被认为是unsigned byte,所以最高位的1将会被解释为符号位,另外Java中存储是按照补码存储,所以1000 0111会被认为是补码形式,转换成原码便是1111 0001,转换成十进制数便是-121
主要介绍了Java中的IP地址和InetAddress类使用详解,是Java入门学习中的基础知识,需要的朋友可以参考下
import java.net.Inet4Address; import java.net.InetAddress; import java.util.Arrays; import jpcap.*;...public static byte[] arp(InetAddress ip) throws java.io.IOException{ //发现本机器的网络接口
获取计算机的mac地址和ip地址,mac地址返回的是一个list,ip地址是string
主要介绍了Java编程中利用InetAddress类确定特殊IP地址的方法,InetAddress类是Java网络编程中一个相当实用的类,需要的朋友可以参考下
InetAddress类的代码,用来获取主机名和IP地址
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/784338
程序很小 但是很精悍,利用了GUI,但是界面还是很差
InetAddress表示ip地址,也就是主机,没有构造方法,只能通过一些get方法获取实例。如果通过主机名来获取InetAddress实例会调用本地的dns服务。
Java网络编程基础-InetAddress类与URL类
是一个可以用java的基本类java.net.InetAddress做的程序实例
InetAddress 类进行域名解析后,域名和ip会保存,如何清除。本资源娓娓道来。
// 通过域名获得InetAddress对象 InetAddress addr = InetAddress.getByName(""); String domainName = addr.getHostName();// 获得主机名 String IPName = addr.getHostAddress();// 获得IP地址 System.out.println...
Java和ColdFusion库可从IP地址查找国家代码和语言。 它使用WHOIS数据库的本地副本来执行快速,准确的国家代码查询。 对于日志分析,国际化,地理位置定位等有用。
InetAddress简单使用例程。网上现有InetAddress例程老是闪退,这是自己重整理后可以使用的完整工程。
通过InetAddress类,可以获取和解析IP地址信息。 URL和URLConnection:URL是Java中表示统一资源定位符的类,用于访问互联网上的资源。URLConnection类提供了一种访问URL资源的方式,可以读取URL指向的数据流。 ...
计算机网络课程设计程序:使用Java的InetAddress类实现简单的PING操作;可以PING一个ip地址;也可以批量PING多个ip地址
InetAddress的用法2---马克-to-win Java视频 马克Java社区
java.net.InetAddress 类包装器。 用法 获取主机的 IP 地址,给定主机名: => (by-name "github.com") # 获取本地主机地址: => (localhost) # 检查地址地址是否可达: => (reachable? (by-name "server-in-...
Java文件夹复制(远程复制(网络传输),用于远程备份... //构造函数(获得服务器端IP地址和监听端口号) public BackupClient(InetAddress ipAddress,int port,File file){ this.ipAddress=ipAddress; this.port=port;