文档章节

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

trayvon
 trayvon
发布于 11/20 08:54
字数 568
阅读 15
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

一、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<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。

© 著作权归作者所有

trayvon

trayvon

粉丝 17
博文 168
码字总数 251923
作品 1
程序员
私信 提问
JAVA【long值与ip地址互转】 - ip的判别

阅读前提: 您需要了解什么是 ip地址 本章目的:实现ip地址和 long类型值的互转 一、应用范围 一般用在登录限制、查找IP所在城市等需求中,windows的ping命令也支持整数形式的IP。 二、关键技...

止静
2014/09/15
3.8K
0
Cloud Foundry warden container 安全性探讨

本文将从Cloud Foundry中warden container的几个方面探讨warden container的安全性。 1. warden container互訪 1.1. 互訪原理· 在Cloud Foundry内部,用户应用的执行环境通过warden contai...

技术mix呢
2017/10/12
0
0
shell解决服务器高可用

HA(High Availability)高可用,有如下三种工作模式。 (1)主从方式 (非对称方式) 工作原理:主机工作,备机处于监控准备状况;当主机宕机时,备机接管主机的一切工作,待主机恢复正常后...

散居江湖
2012/05/11
0
0
MySQL 日期 和 字符串 之间的互转

1.日期转字符串 MySQL DATE_FORMAT() 函数 语法 DATE_FORMAT(date,format) date 参数是合法的日期。 format 规定日期/时间的输出格式。 select date_format(now(), '%Y-%m-%d'); 结果:2016-......

晨猫
2017/10/26
6
0
ChineseUtil v1.1.2 发布,PHP 中文工具包

PHP 中文工具类 ChineseUtil,支持汉字转拼音、拼音分词、简繁互转、数字、金额大写; 本类库字典数据总共收录 73925 个汉字,包括:3955 个简体字,1761 个繁体字,68209 个其它汉字。 码云...

宇润
08/26
2.2K
11

没有更多内容

加载失败,请刷新页面

加载更多

阿里巴巴的 Kubernetes 应用管理实践经验与教训

作者 | 孙健波(天元) 阿里巴巴技术专家 导读:本文整理自孙健波在 ArchSummit 大会 2019 北京站演讲稿记录。首先介绍了阿里巴巴基于 Kubernetes 项目进行大规模应用实践过程中遇到的问题;...

阿里巴巴云原生
14分钟前
3
0
pinpoint采样原理分析

使用pinpoint进行全链路监控时,支持对请求的采样,某条请求是否被采样,取决于整个链路开始的机器。该机器使用特定的采样算法。采样的标志会一直在链路中透传。比如在http里面,会在header里...

xiaomin0322
19分钟前
2
0
在IDEA开发工具中使用lombok

1. 首先我们需要安装IntelliJ IDEA中的lombok插件,打开IntelliJ IDEA后点击菜单栏中的File-->Settings,或者使用快捷键Ctrl+Alt+S进入到设置页面 我们点击设置中的Plugins进行插件的安装,在...

欧阳飘
20分钟前
2
0
爱码仕 5G生活畅想 (五) 每个人每个家庭都有一朵私有的云

30年前,微软让每个家庭都有一台电脑的理念成为了现实;而今云计算的观念已为老百姓们所熟识。数据就是能源;数据就是财富;谁生产了数据,这数据的所有权就归谁所有。随着原生云基础设施的完...

LitStone
22分钟前
3
0
嵌入式入门:嵌入式领域的职业发展方向是什么?

嵌入式入门:嵌入式领域的职业发展方向是什么? 在如今的IT市场上看,嵌入式的发展的应用都是广受欢迎的,在嵌入式入门学习中,我们可以发现嵌入式的发展方向有很多,门槛高低不一样。下面就...

xyd118
22分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部