我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL的IP地址与数字互转原理

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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;

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地址本来就是4字节,每一个字节最大值就是255,所以完全可以使用一个4字节的无符号整型来存放。

2的幂运算就相当于移位运算,所以2^24就相当于向左移了24位,a一个字节最大11111111, 移位运算之后:

11111111 00000000 00000000 00000000

同理,其他位也一样。

注意:必须是无符号整型,因为有符合的整型除了最高位符号位,只有31位,放不下

这样也方便还原,从数字到ip取对应字节转换为数字就可以了。

三、ip到数字实现

public static long ipToNum(String ip) {
    String[] parts = ip.split("\.");
    assert parts.length == 4;
    Long num = 0L;
    for(int i=0;i

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。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL的IP地址与数字互转原理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL的IP地址与数字互转原理

一、inet_aton与inet_ntoainet_aton是把ip地址转为数字的函数,记忆小技巧,inet表示网络相关,在c语言中a习惯性代表字符串,to就是转换的,n代表数字,aton就是字符串转数字,同理inet_ntoa是把数字转换为字符串IP。SEL
MySQL的IP地址与数字互转原理
2017-02-21

Java编程IP地址和数字相互转换代码示例

最近才知道,将ip地址转换成十进制、八进制、十六进制同样可以访问网站。IP转为数字(第二种算法。用左移、按位或实现。效率更高。):public long ipToLong(String ipAddress) { long result =
2023-05-30

MySQL怎么有效的实现存储IP地址及字符串IP和数值之间的转换

小编给大家分享一下MySQL怎么有效的实现存储IP地址及字符串IP和数值之间的转换,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!之间,建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储I
2023-06-22

编程热搜

目录