import lombok.extern.slf4j.Slf4j; /** * @Time 17/7/21. * @Desc IP和int互相转换 */ @Slf4j public class IPIntTurnUtil { /** * 防止实例化, Util类不允许实例化 */ private IPIntTurnUtil(){} //将127.0.0.1形式的IP地址转换成十进制整数,这里没有进行任何错误处理 public static int toInt(String strIp) { int[] ip = new int[4]; //先找到IP地址字符串中.的位置 int position1 = strIp.indexOf("."); int position2 = strIp.indexOf(".", position1 + 1); int position3 = strIp.indexOf(".", position2 + 1); //将每个.之间的字符串转换成整型 ip[0] = Integer.parseInt(strIp.substring(0, position1)); ip[1] = Integer.parseInt(strIp.substring(position1 + 1, position2)); ip[2] = Integer.parseInt(strIp.substring(position2 + 1, position3)); ip[3] = Integer.parseInt(strIp.substring(position3 + 1)); int part1 = ip[0] << 24; int part2 = ip[1] << 16; int part3 = ip[2] << 8; int part4 = ip[3]; return part1 + part2 + part3 + part4; } //将十进制整数形式转换成127.0.0.1形式的ip地址 public static String toIP(int intIP) { StringBuilder sb = new StringBuilder(); //直接右移24位 sb.append(String.valueOf((intIP >>> 24))); sb.append("."); //将高8位置0,然后右移16位 sb.append(String.valueOf((intIP & 0x00FFFFFF) >>> 16)); sb.append("."); //将高16位置0,然后右移8位 sb.append(String.valueOf((intIP & 0x0000FFFF) >>> 8)); sb.append("."); //将高24位置0 sb.append(String.valueOf((intIP & 0x000000FF))); return sb.toString(); } public static void main(String[] args) { log.info("192.168.1.1 IP转数字: {}", toInt("192.168.1.1")); log.info("127.0.0.1 IP转int数字: {}", toInt("127.0.0.1")); log.info("2130706433 数字转IP: {}", toIP(2130706433)); log.info("0.0.0.1 IP转int数字: {}", toInt("0.0.0.1")); log.info("1 数字转IP: {}", toIP(1)); log.info("250.255.0.0 IP转int数字: {}", toInt("250.255.0.0")); log.info("255.255.255.255 IP转数字: {}", toInt("255.255.255.255")); log.info("-1 数字转IP: {}", toIP(-1)); log.info("127.255.255.255 IP转数字: {}", toInt("127.255.255.255")); log.info("Integer最大值转IP: {}", toIP(Integer.MAX_VALUE)); log.info("128.0.0.0 IP转数字: {}", toInt("128.0.0.0")); log.info("Integer最小值转IP: {}", toIP(Integer.MIN_VALUE)); log.info("数字0转 IP: {}", toIP(0)); } }
执行main方法,常见IP被转换成数字后如下图:
11:19:24.462 [main] INFO IPIntTurnUtil - 192.168.1.1 IP转数字: -1062731519
11:19:24.489 [main] INFO IPIntTurnUtil - 127.0.0.1 IP转int数字: 2130706433
11:19:24.490 [main] INFO IPIntTurnUtil - 2130706433 数字转IP: 127.0.0.1
11:19:24.490 [main] INFO IPIntTurnUtil - 0.0.0.1 IP转int数字: 1
11:19:24.491 [main] INFO IPIntTurnUtil - 1 数字转IP: 0.0.0.1
11:19:24.492 [main] INFO IPIntTurnUtil - 250.255.0.0 IP转int数字: -83951616
11:19:24.493 [main] INFO IPIntTurnUtil - 255.255.255.255 IP转数字: -1
11:19:24.493 [main] INFO IPIntTurnUtil - -1 数字转IP: 255.255.255.255
11:19:24.493 [main] INFO IPIntTurnUtil - 127.255.255.255 IP转数字: 2147483647
11:19:24.494 [main] INFO IPIntTurnUtil - Integer最大值转IP: 127.255.255.255
11:19:24.494 [main] INFO IPIntTurnUtil - 128.0.0.0 IP转数字: -2147483648
11:19:24.494 [main] INFO IPIntTurnUtil - Integer最小值转IP: 128.0.0.0
11:19:24.494 [main] INFO IPIntTurnUtil - 数字0转 IP: 0.0.0.0
下面让我们直接在终端命令行,分别IP和IP的数字表示,ping 127.0.0.1, ping 2130706433
changledeMacBook-Pro:~ changle$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.051 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.086 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.078 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.113 ms
^C
--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
--------------------------分割线-------------------------------------
changledeMacBook-Pro:~ changle$ ping 2130706433
PING 2130706433 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.050 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.141 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.097 ms
^C
--- 2130706433 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.050/0.096/0.141/0.037 ms
神奇的发现,居然是一样的。那是因为系统自动会帮我们把数字转成IP。