1.為什么需要將ip轉化為整數
對於ipv4的ip地址,如果使用字符串存儲,占用的空間比較大。比如0.1.2.3這個字符串,需要的是7個字節。而對於255.255.255.255這個字符串,需要的是15個字節。整體看來,存儲一個ip地址需要7-15個字節。
那么實際使用過程中有沒有更好的方式存儲,從而節省存儲空間?答案是肯定的。
ipv4本質是32為的二進制字符串,一個int的整數剛好是4個字節32位,所以一個int類型的整數剛好可以表示一個ipv4地址。因此,我們使用4個字節的int類型數字來表示一個ip地址,這樣可以達到節省空間的目標。
2.ip地址轉整數
下面我們來看看具體怎么實現ip地址轉整數。
public class Ipaddress {
public static boolean isIpv4Address(String ip) {
if (StringUtils.isEmpty(ip)) {
return false;
}
String[] lines = ip.split("\\.");
if (lines.length != 4) {
return false;
}
for (String pattern : lines) {
try {
int number = Integer.parseInt(pattern);
if ((number >= 0) && (number <= 255)) {
continue;
} else {
return false;
}
} catch (NumberFormatException e) {
return false;
}
}
return true;
}
public static int ip2int(String ip) {
if (!isIpv4Address(ip)) {
throw new RuntimeException("invalid ip address");
}
int result = 0;
String[] lines = ip.split("\\.");
for (String pattern : lines) {
int number = Integer.parseInt(pattern);
result = number | (result << 8);
}
return result;
}
public static void main(String[] args) {
String ip = "125.213.100.123";
int result = ip2int(ip);
System.out.println(result);
System.out.println((125 * 256 * 256 * 256) + (213 * 256 * 256) +
(100 * 256) + 123);
}
}
代碼的輸出結果為:
2111136891
2111136891
上面代碼的思路:
1.首先判斷輸入ip地址的合法性。
2.將ip按.分隔,分成4段。
3.將第一段左移24位,第二段左移16位,第三段左移8位,第四段不變,結果相加,就可以得到最終的結果。具體的實現邏輯就是
result = number | (result << 8)這一行。
4.如果是最暴力的方法,main方法里的125*256*256*256+213*256*256+100*256+123這部分,實現的就是第三條提到的邏輯,兩者得到的最終結果是一樣的。
3.整數轉ip地址
反過來,如果我們有一個整數,想轉換為ip地址,其實就是上面的逆過程。
import org.apache.commons.lang3.StringUtils;
public class Ipaddress {
public static String int2ip(int num) {
return ((num >> 24) & 0xff) + "." + ((num >> 16) & 0xff) + "." +
((num >> 8) & 0xff) + "." + (num & 0xff);
}
public static void main(String[] args) {
int num = 2111136891;
String ip = int2ip(num);
System.out.println(ip);
}
}
具體的邏輯為:
ip地址的第一段為num右移24位后取低8位
ip地址的第二段為num右移16位后取低8位
ip地址的第三段為num右移8位后取低8位
ip地址的第四段為num取低8位
