使用位掩碼與移位操作,將 32 位整數表示的 IPv4 地址高效轉換為點分十進制字符串。此方法避免了除法運算,性能優於字符串分割拼接方式。
/**
* 將 32 位整數 IP 轉換為點分十進制字符串
* @param ip 32 位整數(大端序,網絡字節序)
* @return 標準 IPv4 字符串
*/
public static String long2Ip(final long ip) {
final long[] masks = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 };
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < masks.length; i++) {
// 提取字節並右移到最低位
long octet = (ip & masks[i]) >>> (i * 8);
// 從高位開始插入,自動處理點號
sb.insert(0, octet);
if (i < masks.length - 1) {
sb.insert(0, '.');
}
}
return sb.toString();
}
// 測試用例
long ipNum = 0xC0A80101L; // 192.168.1.1
System.out.println(long2Ip(ipNum)); // 輸出: 192.168.1.1
// 邊界值測試
System.out.println(long2Ip(0L)); // 0.0.0.0
System.out.println(long2Ip(0xFFFFFFFFL)); // 255.255.255.255
若數據庫存儲為有符號 INT(如 MySQL INT UNSIGNED 對應 Java long),調用時需轉換:
public static String int2Ip(int ip) {
return long2Ip(ip & 0xFFFFFFFFL); // 關鍵:無符號擴展
}