IP转数字,数字转IP

直接上代码,将IP转换成十进制数字,将十进制数字转换成IP。
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。