大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说MySQL的IP地址与数字互转原理[通俗易懂],希望您对编程的造诣更进一步.
一、inet_aton与inet_ntoa
inet_aton是把ip地址转为数字的函数,记忆小技巧,inet表示网络相关,在c语言中a习惯性代表字符串,to就是转换的,n代表数字,aton就是字符串转数字,同理inet_ntoa是把数字转换为字符串IP。
SELECT inet_aton("192.168.0.1") as ip2num,inet_ntoa(3232235521) as num2ip FROM DUAL;
代码100分
二、算法
假设IP地址为:a.b.c.d
那么对应的num为:
代码100分a * 256^3 + b * 256^2 + c * 256^1 + d * 256^0
# 等价于
a * 2^24 + b * 2^16 + c * 2^8 + d
为什么这么转换呢?
因为ip地址本来就是4字节,每一个字节最大值就是255,所以完全可以使用一个4字节的无符号整型来存放。
2的幂运算就相当于移位运算,所以2^24就相当于向左移了24位,a一个字节最大11111111, 移位运算之后:
11111111 00000000 00000000 00000000
同理,其他位也一样。
注意:必须是无符号整型,因为有符合的整型除了最高位符号位,只有31位,放不下
这样也方便还原,从数字到ip取对应字节转换为数字就可以了。
三、ip到数字实现
代码100分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需要注意的是,需要清除高位,因为低位在移位之后已经被丢弃了,所以不需要清除。
清除位利用的技巧是&运算中0与任何位进行&都为0。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10883.html