MySQL的IP地址与数字互转原理[通俗易懂]

MySQL的IP地址与数字互转原理[通俗易懂]一、inet_aton与inet_ntoa inet_aton是把ip地址转为数字的函数,记忆小技巧,inet表示网络相关,在c语言中a习惯性代表字符串,to就是转换的,n代表数字,aton就是字符…

一、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数字互转

二、算法

假设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

(0)
上一篇 2022-12-20
下一篇 2022-12-20

相关推荐

  • Redis学习之持久化

    Redis学习之持久化简介 持久化是将内存中的瞬时数据,转换为存储在磁盘上的持久数据。redis是一个将数据存储在内存中的数据库,这也是它高效率的原因之一。但是将数据存储在内存,如果遇到突发事件,可能会造成数据的丢失。所…

    2023-02-22
    107
  • mysql 的读写锁与并发控制

    mysql 的读写锁与并发控制1.无论何时只要有多个查询在同一时刻修改数据,都会产生并发控制的问题 2.讨论mysql在两个层面,服务器层和存储引擎层,如何并发控制读写 3.举了个mbox邮箱文件的例子,说如果有多个进程同时对m…

    2023-03-08
    105
  • 【赵强老师】什么是Spark SQL?[通俗易懂]

    【赵强老师】什么是Spark SQL?[通俗易懂]一、Spark SQL简介 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。 为什么要学习Spark SQL?

    2023-03-17
    108
  • Mysql分库分表全面理解「建议收藏」

    Mysql分库分表全面理解「建议收藏」引言 微服务、分布式大行其道的当下,中、高级Java工程师面试题中高并发、大数据量、分库分表等已经成 了面试的高频词汇,这些知识不了解面试通过率不会太高。你可以不会用,但你不能不知道,就是这么 一种…

    2023-02-11
    103
  • NoSQL之一:Memcached

    NoSQL之一:Memcached一、NoSQL简介 NoSQL并不是No SQL(不再需要SQL),而是指Not Only SQL(不仅仅只有SQL)。NoSQL并不是用来替代关系型数据库的,而是在某些使用关系型数据库不合适的场景中

    2023-02-28
    110
  • hdfs的ha机制_redis集群工作原理

    hdfs的ha机制_redis集群工作原理1.简单hdfs集群中存在的问题 不能存在两个NameNode 单节点问题 单节点故障转移 2.解决单节点问题 找额外一个NameNode备份原有的数据 会出现脑裂 脑裂:一个集群中多个管理者数据不一

    2022-12-30
    122
  • MySQL进阶系列:一文详解explain[通俗易懂]

    MySQL进阶系列:一文详解explain[通俗易懂]explain有何用处呢: 为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。 ​ 可以使用explain+SQL语句来模拟优化器执行SQL查询语句,从而知道

    2023-04-22
    108
  • sql group函数_比较运算符有哪些

    sql group函数_比较运算符有哪些本文介绍什么是 SQL GROUPING 运算符,如何使用 SQL GROUPING 运算符。GROUPING 指示是否聚合 GROUP BY 列表中的指定列表达式。 本文重点 只使用 GROUP B

    2023-05-23
    86

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注