IP地址存储算法

该算法是很久以前参加某大厂面试的时候要求手写的代码,改算法常见且基础,当时实在是太年轻了,没有全面发展自己,面试过程和结果都特别不堪。。。
最近在看阿里开源的fescar源码的时候突然看到工具类中的转换算法,于是想整理下这个知识点给各位。

使用long类型存储和传输IP地址可以有效的减少存储所需的空间或者传输所需码流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class IpUtil {

private static final String LOCALHOST = "127.0.0.1";

/**
* ip地址编码
*
* @param address
* @return
*/
public static long ipToLong(String address) {
long[] ip = new long[4];
int i = 0;
for (String ipStr : address.split("\\.")) {
ip[i] = Long.parseLong(ipStr);
i++;
}
return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];

}

/**
* ip地址解码
*
* @param address
* @return
*/
public static String ipToString(long address) {
StringBuffer sb = new StringBuffer("");
sb.append(String.valueOf((address >>> 24)));
sb.append(".");
sb.append(String.valueOf((address & 0x00FFFFFF) >>> 16));
sb.append(".");
sb.append(String.valueOf((address & 0x0000FFFF) >>> 8));
sb.append(".");
sb.append(String.valueOf((address & 0x000000FF)));
return sb.toString();
}

public static void main(String[] args) {
long anlong = ipToLong(LOCALHOST);
System.out.println(anlong);
String host = ipToString(anlong);
System.out.println(host);

}
}