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

相关推荐

  • Python流程控制:while和if循环的应用

    Python流程控制:while和if循环的应用Python中的while循环是一种基本的流程控制语句,它翻译为“当…时”,表示当某个条件满足时,就不断执行某个任务。它的语法为:

    2024-02-12
    83
  • 基于约束的SQL注入[亲测有效]

    基于约束的SQL注入[亲测有效]# 漏洞原理 在谈论这种攻击手法之前,首先我们需要了解几个关键知识点。 1、在SQL中执行字符串处理时,字符串末尾的空格符将会被删除。换句话说,‘nocoriander’和‘nocoriander …

    2023-04-04
    155
  • mysql多实例部署[亲测有效]

    mysql多实例部署[亲测有效]1.软件下载 [root@localhost ~]# cd /usr/src/ [root@localhost src]# wget https://downloads.mysql.com/archi

    2023-05-29
    162
  • Python 函数参数

    Python 函数参数当定义一个函数时,可以给函数的参数设置默认值。当调用该函数时,如果没有给该参数传入值,则默认使用设置的默认值。

    2024-03-06
    94
  • Python字符串拼接函数的用法及示例

    Python字符串拼接函数的用法及示例在程序中,我们有时需要将多个字符串拼接在一起,以形成一个更长的、更具表现力的信息。Python字符串拼接是实现这一功能的重要工具。字符串拼接具有广泛的应用场景,例如数据报告的生成、核心算法的实现、根据用户输入动态生成URL等。在Python中,实现字符串拼接的方法有多种,其中最常用的就是使用“+”运算符实现,其基本语法如下:

    2024-04-04
    79
  • sqlserver2014部署安装[通俗易懂]

    sqlserver2014部署安装[通俗易懂]百度云网址链接: https://pan.baidu.com/s/1BwgdnESI8Fqlos9EIOLv1A 提取码: wsy5 1.解压ISO镜像文件,点击setup安装程序 2.进入安装界面

    2022-12-29
    146
  • mysql基础操作「建议收藏」

    mysql基础操作「建议收藏」查看有哪些库:show databases;进入某个库:use 库名;进入库之后查看有哪些表:show tables;查看某张表的结构:desc 表名;查看某张表的所有内容:select * from

    2023-03-06
    179
  • 使用setup.py来管理Python项目的依赖

    使用setup.py来管理Python项目的依赖Python是一门广受欢迎和广泛应用的编程语言,拥有优秀的生态系统和强大的第三方包支持。当我们在开发Python项目的时候,通常需要引用许多第三方库和框架。这时候,就需要一个好的依赖管理工具来帮助我们管理这些依赖关系,以确保项目的可靠性和稳定性。在Python中,使用setup.py来管理项目依赖是一种非常常见的做法。

    2024-03-25
    83

发表回复

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