IP和字符串的相互转换

本文最后更新于:2023年5月15日 下午

来源

本文出自:MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换

写法

仔细想想,IPv4的每一部分其实都是0~255的取值,也就是8 bit的大小,如果转换成整型那么就只需要32 bit4个字节的大小。
而转换的方法也是顺着这个思路,先把字符串以.为分隔符分成四部分,再把这四部分进行位操作后加起来,就能得到整型的IPv4地址了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* @author Mikan
*/

/**
* 把字符串IP转换成long
*
* @param ipStr 字符串IP
* @return IP对应的long值
*/
public static long ip2Long(String ipStr) {
String[] ip = ipStr.split("\\.");
return (Long.valueOf(ip[0]) << 24) + (Long.valueOf(ip[1]) << 16)
+ (Long.valueOf(ip[2]) << 8) + Long.valueOf(ip[3]);
}

那么转换回去的思路也大差不差,先用位操作得到四个部分,再进行转型和字符串合并。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 把IP的long值转换成字符串
*
* @param ipLong IP的long值
* @return long值对应的字符串
*/
public static String long2Ip(long ipLong) {
StringBuilder ip = new StringBuilder();
ip.append(ipLong >>> 24).append(".");
ip.append((ipLong >>> 16) & 0xFF).append(".");
ip.append((ipLong >>> 8) & 0xFF).append(".");
ip.append(ipLong & 0xFF);
return ip.toString();
}

比较尴尬的是java没有无符号整型,只好直接使用长整型来存储了(不觉得另一种意义上的十分浪费吗.jpg)。

写在最后

原文中提到MySQL中是自带相应函数来把字符串格式的IP转换成整数的INET_ATON和IP转换成字符串的INET_NTOA的,还有适应IPv6INET6_ATONINET6_NTOA,之后可以学习一下。

这里有一只爱丽丝

希望本文章能够帮到您~


IP和字符串的相互转换
https://map1e-g.github.io/2023/05/15/ip2str/
作者
MaP1e-G
发布于
2023年5月15日
许可协议