IP 地址与 int 互相转换,代码实现¶
一、为什么要转 int¶
IPv4 是 32 位,用 int 存储比字符串省空间,查询快。
二、代码实现¶
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_ATON 和 INET_NTOA:
用 INT UNSIGNED 存储,比 VARCHAR 省空间,且支持范围查询:
四、注意¶
- Java 的 int 是有符号的,可能出现负数,业务层要理解。
- MySQL 用
INT UNSIGNED无符号。 - IPv6 不能这样存,见 IPv6 存储方案。
面试加分
- 用位运算而不是
a*256^3 + b*256^2 + ...,更快。 - 数据库里 IP 用 int 存,索引和范围查询都更快。