zoukankan      html  css  js  c++  java
  • MySQL中以数值类型存储IP地址

    前言

      数据库中存储IP地址的时候,推荐使用整数存储而不是字符串。一般来说, 在保证正确性的前提下,尽量使用最小的数据类型来存储和展示数据;小的数据类型一般比大的更快,因为小的数据类型占用的磁盘空间,内存和cup缓存都相对小,需要的cpu处理也要相对少; 这个原则很重要,设计的时候不要低估待存储数据的数据范围。

    IPv4地址和int类型数字互转

    package com.hoss.ext.authentication;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * IPv4地址和int类型数字互转
     *
     * @author Wiener
     * @date 2021/4/29
     */
    public class SaveIp {
    
        public static void main(String[] args) {
            String ip = "127.0.0.1";
            String ip33 = "172.16.24.33";
            String ip13 = "172.16.10.13";
            String ip89 = "111.112.113.114";
            intToIp(ipToInt(ip89));
        }
    
        /**
         * (Ip转Integer)
         * 方法名:ipToInt
         *
         * @throws
         * @since 1.0.0
         */
        public static int ipToInt(String ip) {
            if (!isIPv4Address(ip)) {
                throw new RuntimeException("Invalid ip address");
            }
            String[] ips = ip.split("\.");
            int ipInt = 0;
            //因为每个位置最大255,刚好在2进制里表示8位
            for (String ip4 : ips) {
                Integer ip4a = Integer.parseInt(ip4);
                //这里应该用+也可以,但是位运算更快
                ipInt = (ipInt << 8) | ip4a;
            }
            System.out.println(ipInt);
    
            return ipInt;
        }
    
        /**
         * 判断是否为ipv4地址
         *
         * @param ipv4Addr
         * @return true 是ipv4地址
         */
        private static boolean isIPv4Address(String ipv4Addr) {
            // 0-255的数字
            String lower = "(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])";
            String regex = lower + "(\." + lower + "){3}";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(ipv4Addr);
            return matcher.matches();
        }
    
        /**
         * (Integer转IP)
         * 方法名:intToIp
         *
         * @param ip数字
         * @return String
         */
        public static String intToIp(int ip) {
            //思路很简单,每8位拿一次,就是对应位的IP
            StringBuilder sb = new StringBuilder();
            for (int i = 3; i >= 0; i--) {
                int ipa = (ip >> (8 * i)) & (0xff);
                sb.append(ipa + ".");
            }
            sb.delete(sb.length() - 1, sb.length());
            System.out.println("数字转IP:" + sb);
            return sb.toString();
        }
    
    }
    

    Reference


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    从json中获取自己想要的属性
    对称加密解密
    springboot 读取resource目录下的文件
    安装nginx 配置了ssl 启动报错
    复利计算--4.0 单元测试之JAVA版-软件工程
    《构建之法》前三章读后感
    单利 复利计算器程序1.0 2.0 3.0 [ 合 ] 之 WEB
    操作系统 实验一 命令解释程序的编写
    单利 复利计算器程序1.0 2.0 3.0 [ 合 ] 之 C语言
    统计实验数据 总结实验结果
  • 原文地址:https://www.cnblogs.com/east7/p/14722866.html
Copyright © 2011-2022 走看看