首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

Java 實現 IP 地址與長整數(十進制)互轉核心算法詳解

     編輯:關於JSP

前言

IPv4 地址本質是 32 位無符號整數,常以點分十進制(如 192.168.1.1)呈現。在數據庫存儲、網絡比對、範圍查詢等場景,將其轉為 long 型整數可大幅提升性能與便利性。本文從位運算原理出發,提供兩種高效實現並分析細節。

一、核心原理:位移與掩碼

IPv4 四段各佔 8 位(0-255),組合為 32 位:

IP = (段1 << 24) | (段2 << 16) | (段3 << 8) | 段4
  • 左移:相當於乘以 2 的 n 次方(x << n == x * 2^n)。
  • 無符號右移 >>>>:高位補 0,關鍵處理 Java 無無符號類型問題。
  • 位與 & 掩碼:提取特定 8 位(0xFF = 255)。

二、IP 轉長整數(IP → Long)

方法 1:手動解析(教學用)

public static long ipToLong(String ipStr) {
    String[] parts = ipStr.split("\\.");
    long result = 0;
    for (int i = 0; i < 4; i++) {
        result = (result << 8) + Long.parseLong(parts[i]);
    }
    return result;
}

方法 2:位運算一行流(生產推薦)

public static long ipToLong(String ip) {
    String[] items = ip.split("\\.");
    return (Long.parseLong(items[0]) << 24)
         | (Long.parseLong(items[1]) << 16)
         | (Long.parseLong(items[2]) << 8)
         | Long.parseLong(items[3]);
}

注意:split("\\.") 需轉義點號;輸入應預校驗格式。

三、長整數轉 IP(Long → IP)

標準實現(高位優先輸出)

public static String longToIp(long ipLong) {
    StringBuilder sb = new StringBuilder();
    sb.append((ipLong >>> 24) & 0xFF).append('.');
    sb.append((ipLong >>> 16) & 0xFF).append('.');
    sb.append((ipLong >>> 8) & 0xFF).append('.');
    sb.append(ipLong & 0xFF);
    return sb.toString();
}
  • >>> 24 取最高 8 位,& 0xFF 確保無符號。
  • 依次右移 16、8、0 位提取其餘三段。

四、完整可運行 Demo

public class IpConverter {
    public static void main(String[] args) {
        String ip = "202.112.96.163";
        long num = ipToLong(ip);
        String back = longToIp(num);
        
        System.out.println("原始 IP: " + ip);
        System.out.println("十進制: " + num);           // 3396362403
        System.out.println("二進制: " + Long.toBinaryString(num));
        System.out.println("反轉 IP: " + back);         // 202.112.96.163
    }
    // 此處放上述兩個 static 方法
}

五、進階話題與避坑

  1. 有號長整數顯示負值:Java long 有號,超過 2^31-1 會顯示負數,但位模式正確,存儲/計算無影響。
  2. IPv6 不適用:128 位需用 BigInteger 或 byte[16]。
  3. 性能優化:高頻調用可用 InetAddress.getByName(ip).getAddress() 取 byte[] 再移位,避免字符串分割開銷。
  4. 數據庫應用:MySQL 可用 INET_ATON()/INET_NTOA();PostgreSQL 用 inet 類型原生支援。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved