1. 程式人生 > 程式設計 >Java實現ip地址和int數字的相互轉換

Java實現ip地址和int數字的相互轉換

Java版本的 ip地址和int數字的相互轉換

對於ipv4的地址來說,如果用字串的形式儲存的話,其佔用位元組就比較大,比如對於IPv4地址0.0.0.0的字串,就需要7個位元組,IPv4為255.255.255.255 的字串,需要15個位元組,也就是說儲存一個ip需要佔用7~15個位元組。

那麼有沒有更節省空間的儲存方式呢?答案是有。

方案1:

直接把字串中的'.'去掉,不就變成一個數字了嘛,比如 "255.255.255.255" 變成 255255255255,然而我們知道int所能表示的最大值 = Integer.MAX_VALUE = 2^31-1 = 2147483647, 255255255255 > 2^31-1,所以需要用長整形long來表示,長整形佔用8個位元組,也就是說我們將7~15個位元組轉換為8位元組,在絕大多數情況下是節省空間了的。

方案2:

因為考慮到IPv4的地址本質上就是32位的二進位制串,而一個int型別的數字剛好為4個位元組32個bit位,所以剛好可以用一個int型別的數字轉表示IPv4地址。所以,我們可以用4個位元組的int數字表示一個ip地址,這樣可以大大節省空間。

這裡只討論方案2 :)

演示

對於ipv4地址: 192.168.1.3:

每段都用二進位制表示: 192(10) = 11000000(2) ; 168(10) = 10101000(2) ; 1(10) = 00000001(2) ; 3(10) = 00000011(2) 。

所以連在一起就是:11000000101010000000000100000011,對應的int數字就是-1062731775 。

具體演算法分析:

192左移24位: 11000000 00000000 00000000 00000000

168左移16位: 00000000 10101000 00000000 00000000

001左移08位: 00000000 00000000 00000001 00000000

003左移00位: 00000000 00000000 00000000 00000011

按位或結果 : 11000000 10101000 00000001 00000011

即 -1062731775

將int型別的數字轉換成ip地址,其實就是上述過程的逆過程,這裡就不再贅述。

具體實現方式:

package com.sunjs.kit;
 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 * IPv4地址和int數字的互換
 * @author sun
 */
public class IpKit {
 
  /**
   * IPv4地址轉換為int型別數字
   * @param ipv4Addr
   * @return
   */
  public static int ipToInt(String ipv4Addr) {
    // 判斷是否是ip格式的
    if (!isIPv4Address(ipv4Addr))
      throw new RuntimeException("Invalid ip address");
 
    // 匹配數字
    Pattern pattern = Pattern.compile("\\d+");
    Matcher matcher = pattern.matcher(ipv4Addr);
    int result = 0;
    int counter = 0;
    while (matcher.find()) {
      int value = Integer.parseInt(matcher.group());
      result = (value << 8 * (3 - counter++)) | result;
    }
    return result;
  }
 
  /**
   * 判斷是否為ipv4地址
   * @param ipv4Addr
   * @return
   */
  private static boolean isIPv4Address(String ipv4Addr) {
    String lower = "(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])"; // 0-255的數字
    String regex = lower + "(\\." + lower + "){3}";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(ipv4Addr);
    return matcher.matches();
  }
   
  /**
   * 將int數字轉換成ipv4地址
   * @param ip
   * @return
   */
  public static String intToIp(int ip) {
    StringBuilder sb = new StringBuilder();
    int num = 0;
    boolean needPoint = false; // 是否需要加入'.'
    for (int i = 0; i < 4; i++) {
      if (needPoint) {
        sb.append('.');
      }
      needPoint = true;
      int offset = 8 * (3 - i);
      num = (ip >> offset) & 0xff;
      sb.append(num);
    }
    return sb.toString();
  }
   
  public static void main(String[] args) {
    String ip = "124.202.200.166";
  System.out.println(ipToInt(ip));
  System.out.println(intToIp(2093664422));
  }
   
}

以上就是Java實現ip地址和int數字的相互轉換的詳細內容,更多關於Java ip和數字相互轉換的資料請關注我們其它相關文章!