java IP与数值之间的相互转换
1.情景展示
当我们需要将IP存进mysql数据库的时候,数据库的设计是:建议我们存入IP转换成的数值。
作者建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串。
相对字符串存储,使用无符号整数来存储有如下的好处:
- 节省空间,不管是数据存储空间,还是索引存储空间;
- 便于使用范围查询(BETWEEN...AND),且效率更高。
使用无符号整数来存储也有缺点:
- 不便于阅读
- 需要手动转换
对于转换来说,MySQL提供了相应的函数来把字符串格式的IP转换成整数INET_ATON(),以及把整数格式的IP转换成字符串的INET_NTOA()。
下面讲一下,如何使用java实现IP和数值之前的转换?
2.方式一
查看代码
/**
* 把字符串IP转换成long
* @param ipStr 字符串IP
* @return IP对应的long值
*/
public static long ip2Long(@NotNull 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]);
}
/**
* 把IP的long值转换成字符串
* @param ipLong IP的long值
* @return long值对应的字符串
*/
@NotNull
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();
}
3.方式二
查看代码
public static Long convertIPv4(String ipStr) {
if (ipStr != null && !ipStr.isEmpty()) {
try {
String[] ipTokens = ipStr.split("\\.");
if (ipTokens.length != 4) {
throw new IllegalArgumentException("IP字符串错误:" + ipStr);
} else {
long ipNum = 0L;
for(int i = 0; i < 4; ++i) {
ipNum = (ipNum << 8) + (long)Integer.parseInt(ipTokens[i]);
}
return ipNum;
}
} catch (RuntimeException var5) {
log.error("IP转换错误:" + ipStr, var5);
throw var5;
}
} else {
return null;
}
}
public static String convertIPv4(long ipNum) {
return (ipNum >>> 24) + "." + ((ipNum & 16777215L) >>> 16) + "." + ((ipNum & 65535L) >>> 8) + "." + (ipNum & 255L);
}
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/15831174.html