IP 地址(IPv4)與 32 位無符號整數的相互轉換是網絡編程中的基礎技能。本文將從二進制原理出發,詳解轉換邏輯,並提供生產級的高效實現代碼。
IPv4 地址由 4 個字節組成(如 192.168.1.1),每個字節範圍 0-255,正好對應 8 位二進制。將 4 個字節拼湊成 32 位二進制數,即為對應的長整型數值。
IP: 10.0.3.193 二進制: 00001010 00000000 00000011 11000001 合併: 00001010000000000000001111000001 十進制: 167773121
代碼實現:
public static long ip2long(String ip) {
String[] parts = ip.split("\\.");
return (Long.parseLong(parts[0]) << 24) |
(Long.parseLong(parts[1]) << 16) |
(Long.parseLong(parts[2]) << 8) |
Long.parseLong(parts[3]);
}
關鍵點:使用無符號右移 >>> 和位或 | 運算,配合 Long 類型避免符號位問題。
public static String long2ip(long ip) {
StringBuilder sb = new StringBuilder();
sb.append((ip >>> 24) & 0xFF).append('.');
sb.append((ip >>> 16) & 0xFF).append('.');
sb.append((ip >>> 8) & 0xFF).append('.');
sb.append(ip & 0xFF);
return sb.toString();
}
關鍵點:& 0xFF 掩碼提取低 8 位,無符號右移 >>> 保證高位補 0。
對於性能極其敏感的場景,可避免正則表達式開銷:
public static long ipToLong(String ip) {
long result = 0;
int start = 0;
for (int i = 0; i < 4; i++) {
int end = ip.indexOf('.', start);
if (i == 3) end = ip.length();
int part = Integer.parseInt(ip.substring(start, end));
result = (result << 8) | part;
start = end + 1;
}
return result;
}
Integer.MAX_VALUE,必須用 long 存儲IpHelper掌握位運算思維,不僅能高效解決 IP 轉換,更能在網絡編程、數據壓縮、權限掩碼等領域遊刃有餘。