zoukankan      html  css  js  c++  java
  • Mysql IP类型转换

    Mysql IP类型转换

    inet_aton:将ip地址转换成数字型 (ip_net_address_to_number)
    inet_ntoa:将数字型转换成ip地址 (ip_net_number_to_address)

    使用示例:

    SELECT INET_ATON('254.161.167.28');
    -> 4272006940
     
    SELECT INET_NTOA(4272006940);
    -> '254.161.167.28'
    

    Mysql IP移位算法

    假设IP地址为:a.b.c.d

    那么对应的num为:

    a * 256^3 + b * 256^2 + c * 256^1 + d * 256^0
    # 等价于
    a * 2^24 + b * 2^16 + c * 2^8 + d
    

    三、ip到数字实现

    public static long ipToNum(String ip) {
        String[] parts = ip.split(".");
        assert parts.length == 4;
        Long num = 0L;
        for(int i=0;i<parts.length;i++){
            num += (Long.parseLong(parts[i]) << (24 - i * 8));
        }
        return num;
    }
    

    java因为没有无符号整型,所以使用long,下面给一个更加直观的实现。

    public static long ipToNum(String ip) {
        String[] parts = ip.split(".");
        assert parts.length == 4;
        return (Long.parseLong(parts[0]) << 24) + (Long.parseLong(parts[1]) << 16) + (Long.parseLong(parts[2]) << 8) + Long.parseLong(parts[3]);
    }
    

    四、数字到ip实现

    public static String numToIP(long ipNum){
        String result = String.format("%d.%d.%d.%d", ipNum >>> 24, (ipNum & 0x00FFFFFF) >>> 16, (ipNum & 0x0000FFFF) >>> 8, ipNum & 0x000000FF);
        return result;
    }
    

    数字到ip需要注意的是,需要清除高位,因为低位在移位之后已经被丢弃了,所以不需要清除。

    因为ip地址本来就是4字节,每一个字节最大值就是255,所以完全可以使用一个4字节的无符号整型来存放。

    相关链接

    https://www.cnblogs.com/Donal/archive/2008/07/03/1234753.html
    https://www.codenong.com/c3131559/

    【励志篇】: 古之成大事掌大学问者,不惟有超世之才,亦必有坚韧不拔之志。
  • 相关阅读:
    我叫mt3.0更新公告
    gcc 编译器常用的命令行参数一览
    C++两个类相互引用错误留影
    C++中的声明与定义
    C++ 杂记
    C++中两个类相互包含引用的相关问题
    Ogre 中使用OIS的两种模式
    Ogre 渲染队列(二)
    Ogre 渲染队列(一)
    Ogre 场景管理器
  • 原文地址:https://www.cnblogs.com/tomtellyou/p/13913256.html
Copyright © 2011-2022 走看看