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

Java 實現 IP 地址與長整型數字互轉:原理詳解與高效代碼實現

     編輯:Java 程式設計入門

IP 地址(IPv4)與 32 位無符號整數的相互轉換是網絡編程中的基礎技能。本文將從二進制原理出發,詳解轉換邏輯,並提供生產級的高效實現代碼。

核心原理:位運算的藝術

IPv4 地址由 4 個字節組成(如 192.168.1.1),每個字節範圍 0-255,正好對應 8 位二進制。將 4 個字節拼湊成 32 位二進制數,即為對應的長整型數值。

IP 轉長整型:左移與或運算

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 類型避免符號位問題。

長整型轉 IP:右移與掩碼

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。

進階版:手動解析字符串(不依賴 split)

對於性能極其敏感的場景,可避免正則表達式開銷:

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;
}

常見坑點提醒

  • 符號位問題:Java 無無符號類型,IP 對應的長整型可能超過 Integer.MAX_VALUE,必須用 long 存儲
  • 輸入校驗:生產代碼必須校驗 IP 格式合法性、每段範圍 0-255
  • 性能優化:高頻調用場景可考慮預計算查表或使用 Netty 的 IpHelper

應用場景

  • IP 地址範圍查詢(數據庫索引優化)
  • 網絡設備配置管理
  • 日誌分析、流量統計
  • 分佈式系統中的節點標識

掌握位運算思維,不僅能高效解決 IP 轉換,更能在網絡編程、數據壓縮、權限掩碼等領域遊刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved