IP转数字

255.255.255.255 直接以字符串存入数据库使用varchar(15),而ipv4本质是32位的二进制码,int也有32位,但是因为有一个符号位存不下所以只能用long型来存储ip了。8个字节还是比15个字节差不多省了一半空间了。

0xFF,这代表的是十六进制数FF即1111 1111,对应十进制即为255,当一个数n对这个 0xFF 作 & 操作时,相当于求n除以256所得的余数,也就是相当于n%256

代码实现

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
public class IPUtil {
/**
* ip地址转成long型数字
* 将IP地址转化成整数的方法如下:
* 1、通过String的split方法按.分隔得到4个长度的数组
* 2、通过左移位操作(<<)给每一段的数字加权,第一段的权为2的24次方,第二段的权为2的16次方,第三段的权为2的8次方,最后一段的权为1
* @param strIp
* @return
*/
public static long ipToLong(String strIp) {
String[]ip = strIp.split("\\.");
return (Long.parseLong(ip[0]) << 24) + (Long.parseLong(ip[1]) << 16) + (Long.parseLong(ip[2]) << 8) + Long.parseLong(ip[3]);
}

/**
* 将十进制整数形式转换成127.0.0.1形式的ip地址
* 将整数形式的IP地址转化成字符串的方法如下:
* 1、将整数值进行右移位操作(>>>),右移24位,右移时高位补0,得到的数字即为第一段IP。
* 2、通过与操作符(&)将整数值的高8位设为0,再右移16位,得到的数字即为第二段IP。
* 3、通过与操作符吧整数值的高16位设为0,再右移8位,得到的数字即为第三段IP。
* 4、通过与操作符吧整数值的高24位设为0,得到的数字即为第四段IP。
* @param longIp
* @return
*/
public static String longToIP(long longIp) {
StringBuffer sb = new StringBuffer("");
sb.append(String.valueOf((longIp >>> 24)));
sb.append(".");
sb.append(String.valueOf((longIp >>> 16) & 0xFF ));
sb.append(".");
sb.append(String.valueOf((longIp >>> 8) & 0xFF));
sb.append(".");
sb.append(String.valueOf((longIp)));
return sb.toString();
}

public static void main(String[] args) {
System.out.println(ipToLong("219.239.110.138"));
System.out.println(longToIP(18537472));
}
}

IP转数字
https://lililib.github.io/IP转数字/
作者
煨酒小童
发布于
2023年2月19日
许可协议