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);
}

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

posted @ 2022-01-21 17:41  Marydon  阅读(1215)  评论(0编辑  收藏  举报