Java 输出通过 InetAddress 获得的 IP 地址数组
使用 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();
}
转载于:https://www.cnblogs.com/suncoolcat/p/3324800.html
Java 输出通过 InetAddress 获得的 IP 地址数组相关推荐
- Java技巧: 根据网址查询DNS/IP地址
需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号. 说明: 本文不涉及底层的 DNS 协议, ...
- java 如何获取本机所有ip地址呢?
转自: java 如何获取本机所有ip地址呢? ip地址简介: IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址. IP地址是IP协议提供的一种统一 ...
- Java里面获取当前服务器的IP地址
java中获取当前服务器地址主要使用到InetAddress这个类 public static void main(String[] args) {try {//用 getLocalHost() 方法 ...
- Java获取请求客户端的真实IP地址
整理网友的材料,最后有源码,亲测能解决所有java获取IP真实地址的问题 整理的这里: 1.链接1 2.链接2 JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr() ...
- java ip 获取了两个_用Java获取本地的多个IP地址
翻API翻出来的,拿出来晒晒... 特别适用于获取本地的多个IP地址 import java.net.InetAddress; import java.net.NetworkInterface; im ...
- java代码获取ip_java如何获取ip地址
java获取IP地址的方法:/** * 通过HttpServletRequest返回IP地址 * * @param request HttpServletRequest * @return ip St ...
- java中获取当前服务器的Ip地址
1.tomcat是一款免费的开源Web服务器,如果部署在本地,那么对应的那么为localhost,对应地址为127.0.0.1. 例子:可以通过http://localhost:8080/项目root ...
- java 获取请求客户端的真实IP地址
转载自:http://leiyongping88.iteye.com/blog/1545930 用request.getRemoteAddr(); 方法获取的IP地址是:127.0.0.1或192.1 ...
- 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- java正则匹配ip_正则表达式 - 匹配 IP 地址
17220161221160719 IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址是IP协议提供的一 ...
最新文章
- android c聊天功能,Android实现简单C/S聊天室应用
- 无人驾驶汽车想要“普渡众生”,还要经历15个磨难
- Sublime Text 3安装Package Control快速建立html5和xhtml文档
- ITK:使用Otsu阈值图像
- 让钱生钱!商人赚钱的6条方法
- .net core精彩实例分享 -- 基础篇
- redux 管理你的 react 应用
- 1. 路过面了个试就拿到2个offer。是运气吗?
- memcached主从复制
- QQ服务器维护一般多久,QQ扩列怎么暂停服务了维护到什么时候结束
- ios7禁止屏幕旋转,强制竖屏
- 前端工程师的基本工作流程
- git bash粘贴快捷键
- K.论演员的自我修养---组合数的运用路径计数
- scipy csc csr到底是什么东西
- python中的exifread库只要一张图片就能获取你的精确位置
- Python数据分析之pandas学习
- no more duplicates will be shown
- SQL Server修改表结构,表和列名加注释说明
- 芋道 Spring Boot 消除冗余代码 Lombok 入门
热门文章
- Windows 安装 Oracle Java JDK
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_34、SpringBoot整合Mybatis实操和打印SQL语句...
- ARC 101E.Ribbons on Tree(容斥 DP 树形背包)
- yum安装Elasticsearch5.x
- CPU Usage (C#) 测试
- 突然出现 -bash: pod: command not found 的解决方法
- apue学习笔记(第六章 系统数据文件和信息)
- MySQL存储过程定时任务
- JavaScript笔记(展开的层)-4
- echarts常用术语