使用 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 地址数组相关推荐

  1. Java技巧: 根据网址查询DNS/IP地址

    需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号. 说明: 本文不涉及底层的 DNS 协议, ...

  2. java 如何获取本机所有ip地址呢?

    转自: java 如何获取本机所有ip地址呢? ip地址简介: IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址. IP地址是IP协议提供的一种统一 ...

  3. Java里面获取当前服务器的IP地址

    java中获取当前服务器地址主要使用到InetAddress这个类 public static void main(String[] args) {try {//用 getLocalHost() 方法 ...

  4. Java获取请求客户端的真实IP地址

    整理网友的材料,最后有源码,亲测能解决所有java获取IP真实地址的问题 整理的这里: 1.链接1 2.链接2 JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr() ...

  5. java ip 获取了两个_用Java获取本地的多个IP地址

    翻API翻出来的,拿出来晒晒... 特别适用于获取本地的多个IP地址 import java.net.InetAddress; import java.net.NetworkInterface; im ...

  6. java代码获取ip_java如何获取ip地址

    java获取IP地址的方法:/** * 通过HttpServletRequest返回IP地址 * * @param request HttpServletRequest * @return ip St ...

  7. java中获取当前服务器的Ip地址

    1.tomcat是一款免费的开源Web服务器,如果部署在本地,那么对应的那么为localhost,对应地址为127.0.0.1. 例子:可以通过http://localhost:8080/项目root ...

  8. java 获取请求客户端的真实IP地址

    转载自:http://leiyongping88.iteye.com/blog/1545930 用request.getRemoteAddr(); 方法获取的IP地址是:127.0.0.1或192.1 ...

  9. 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  10. java正则匹配ip_正则表达式 - 匹配 IP 地址

    17220161221160719 IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址是IP协议提供的一 ...

最新文章

  1. android c聊天功能,Android实现简单C/S聊天室应用
  2. 无人驾驶汽车想要“普渡众生”,还要经历15个磨难
  3. Sublime Text 3安装Package Control快速建立html5和xhtml文档
  4. ITK:使用Otsu阈值图像
  5. 让钱生钱!商人赚钱的6条方法
  6. .net core精彩实例分享 -- 基础篇
  7. redux 管理你的 react 应用
  8. 1. 路过面了个试就拿到2个offer。是运气吗?
  9. memcached主从复制
  10. QQ服务器维护一般多久,QQ扩列怎么暂停服务了维护到什么时候结束
  11. ios7禁止屏幕旋转,强制竖屏
  12. 前端工程师的基本工作流程
  13. git bash粘贴快捷键
  14. K.论演员的自我修养---组合数的运用路径计数
  15. scipy csc csr到底是什么东西
  16. python中的exifread库只要一张图片就能获取你的精确位置
  17. Python数据分析之pandas学习
  18. no more duplicates will be shown
  19. SQL Server修改表结构,表和列名加注释说明
  20. 芋道 Spring Boot 消除冗余代码 Lombok 入门

热门文章

  1. Windows 安装 Oracle Java JDK
  2. 小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_34、SpringBoot整合Mybatis实操和打印SQL语句...
  3. ARC 101E.Ribbons on Tree(容斥 DP 树形背包)
  4. yum安装Elasticsearch5.x
  5. CPU Usage (C#) 测试
  6. 突然出现 -bash: pod: command not found 的解决方法
  7. apue学习笔记(第六章 系统数据文件和信息)
  8. MySQL存储过程定时任务
  9. JavaScript笔记(展开的层)-4
  10. echarts常用术语