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/