跳转至

IP 地址与 int 互相转换,代码实现

一、为什么要转 int

IPv4 是 32 位,用 int 存储比字符串省空间,查询快。

192.168.1.1 -> 0xC0A80101 -> -1062731519

二、代码实现

public class IpUtils {

    public static int ipToInt(String ip) {
        String[] parts = ip.split("\\.");
        int result = 0;
        for (int i = 0; i < 4; i++) {
            result <<= 8;
            result |= Integer.parseInt(parts[i]);
        }
        return result;
    }

    public static String intToIp(int ip) {
        return ((ip >> 24) & 0xFF) + "." +
               ((ip >> 16) & 0xFF) + "." +
               ((ip >> 8) & 0xFF) + "." +
               (ip & 0xFF);
    }

    public static void main(String[] args) {
        int v = ipToInt("192.168.1.1");
        System.out.println(v);              // -1062731519
        System.out.println(intToIp(v));     // 192.168.1.1
    }
}

三、MySQL 存储

MySQL 提供 INET_ATONINET_NTOA

SELECT INET_ATON('192.168.1.1');   -- 返回整数
SELECT INET_NTOA(3232235777);      -- 返回 IP

INT UNSIGNED 存储,比 VARCHAR 省空间,且支持范围查询:

SELECT * FROM log
WHERE ip BETWEEN INET_ATON('192.168.0.0') AND INET_ATON('192.168.255.255');

四、注意

  • Java 的 int 是有符号的,可能出现负数,业务层要理解。
  • MySQL 用 INT UNSIGNED 无符号。
  • IPv6 不能这样存,见 IPv6 存储方案

面试加分

  • 用位运算而不是 a*256^3 + b*256^2 + ...,更快。
  • 数据库里 IP 用 int 存,索引和范围查询都更快。