废话不多说系列,直接展示 ~
一、完整代码
对于 IPv4 和数值类型,我们可以放在应用层,使用 Java 来处理转换;其核心功能:
- IP 转 整数;
- 整数 转 IP;
package edu.study.module.up.util;
/**
* IPv4 的转换:IP 和 整数 互转( 博客地址:https://mp.weixin.qq.com/s/jFtkd5ibOUgl7CTk9VVR8w )
*
* @author zero
* @create 2021-08-03 10:38
*/
public class Ip2LongUtil {
public static void main(String[] args) {
System.out.println(ip2Long("192.168.0.1"));
System.out.println(long2Ip(3232235521L));
System.out.println(ip2Long("10.0.0.1"));
}
/**
* 把字符串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]);
}
/**
* 把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();
}
}
(2)结果实例
3232235521
192.168.0.1
167772161
三、数据库将 IP 地址存为 整数
(1)IPv4 转换
mysql> select inet_aton('192.168.0.1');
+--------------------------+
| inet_aton('192.168.0.1') |
+--------------------------+
| 3232235521 |
+--------------------------+
1 row in set (0.00 sec)
mysql> select inet_ntoa(3232235521);
+-----------------------+
| inet_ntoa(3232235521) |
+-----------------------+
| 192.168.0.1 |
+-----------------------+
1 row in set (0.00 sec)
(2)IPv6 转换
对于 IPv6 来说,使用 varbinary 同样可获得相同的好处,同时 MySQL 也提供了响应的转换函数,即 inet6_aton() 和 inet6_ntoa() 。
附录
至此,感谢阅读🙏