项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
经常有同学私信或留言询问相关问题,V号bitcarmanlee。github上star的同学,在我能力与时间允许范围内,尽可能帮大家解答相关问题,一起进步。

1.为什么需要将ip转化为整数

对于ipv4的ip地址,如果使用字符串存储,占用的空间比较大。比如0.1.2.3这个字符串,需要的是7个字节。而对于255.255.255.255这个字符串,需要的是15个字节。整体看来,存储一个ip地址需要7-15个字节。

那么实际使用过程中有没有更好的方式存储,从而节省存储空间?答案是肯定的。
ipv4本质是32为的二进制字符串,一个int的整数刚好是4个字节32位,所以一个int类型的整数刚好可以表示一个ipv4地址。因此,我们使用4个字节的int类型数字来表示一个ip地址,这样可以达到节省空间的目标。

2.ip地址转整数

下面我们来看看具体怎么实现ip地址转整数。

public class Ipaddress {public static boolean isIpv4Address(String ip) {if (StringUtils.isEmpty(ip)) {return false;}String[] lines = ip.split("\\.");if (lines.length != 4) return false;for(String pattern : lines) {try {int number = Integer.parseInt(pattern);if (number >= 0 && number <= 255) continue;else return false;} catch (NumberFormatException e) {return false;}}return true;}public static int ip2int(String ip) {if (!isIpv4Address(ip)) {throw new RuntimeException("invalid ip address");}int result = 0;String[] lines = ip.split("\\.");for(String pattern: lines) {int number = Integer.parseInt(pattern);result = number | (result << 8);}return result;}public static void main(String[] args) {String ip = "125.213.100.123";int result = ip2int(ip);System.out.println(result);System.out.println(125*256*256*256+213*256*256+100*256+123);}
}

代码的输出结果为:

2111136891
2111136891

上面代码的思路:
1.首先判断输入ip地址的合法性。
2.将ip按.分隔,分成4段。
3.将第一段左移24位,第二段左移16位,第三段左移8位,第四段不变,结果相加,就可以得到最终的结果。具体的实现逻辑就是
result = number | (result << 8)这一行。
4.如果是最暴力的方法,main方法里的125*256*256*256+213*256*256+100*256+123这部分,实现的就是第三条提到的逻辑,两者得到的最终结果是一样的。

3.整数转ip地址

反过来,如果我们有一个整数,想转换为ip地址,其实就是上面的逆过程。

import org.apache.commons.lang3.StringUtils;public class Ipaddress {public static String int2ip(int num) {return ((num >> 24) & 0xff) + "." +((num >> 16) & 0xff) + "." +((num >> 8) & 0xff) + "." +(num & 0xff);}public static void main(String[] args) {int num = 2111136891;String ip = int2ip(num);System.out.println(ip);}
}

具体的逻辑为:
ip地址的第一段为num右移24位后取低8位
ip地址的第二段为num右移16位后取低8位
ip地址的第三段为num右移8位后取低8位
ip地址的第四段为num取低8位

ip地址与整数的相互转化相关推荐

  1. Java实现点分十进制IP地址转换为整数

    package ipaddress; //一.将IP地址转换为整数(IPV4,点分十进制)的关键技术点如下: //1.通过String的indexOf方法找出字符串IP地址中的"." ...

  2. IP 地址与整数之间的互相转换详解

    IP 地址的"构造"是由 32 位二进制数组成的. IP地址转换为整数的代码: 或者: 优化如下: 分析:IP 地址的每段可以看成是一个 0-255 的整数,把每段拆分成一个二进制 ...

  3. C# IP地址和整数之间的转换,IP地址和数字ip地址的转换

    IP地址与整数之间的转换 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数. 举例:一 ...

  4. 将IP地址转换为整数--将32位的二进制转换为十进制

    object Test01_IP地址计算 {def main(args: Array[String]): Unit = {val ip:String = "1.0.3.255"va ...

  5. 实用代码-C#之IP地址和整数的互转

    源码 1 [StructLayout(LayoutKind.Explicit)] 2 public struct IP 3 { 4 public IP(UInt32 value) 5 { 6 this ...

  6. VC中字符串形式ip地址和整数形式ip地址转换

    字符串转整数 int dwAddr = inet_addr("127.0.0.1"); 整数转字符串 struct in_addr inAddr;inAddr.s_addr = d ...

  7. android 整数与ip地址的转换

    今天,简单讲讲android里如何把整数与ip地址进行转换. 这个很简单,在网上查找资料就找到了.这里记录一下. 1.IP地址转换为整数 将IP地址转化成整数的方法如下:      1.通过Strin ...

  8. 华为机试HJ33:整数与IP地址间的转换

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起 ...

  9. java ip地址转数字_ip地址与整数相互转换

    1.ip地址转成整数 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成整数. 举例:一个ip地址为10.0.3.193 每段数字     ...

  10. mysql中存储ip地址,将ip转换为整数存储

    mysql中将ip转换为整数存储,可以节省空间和提高性能,但是不利于阅读.<msql高性能>中推荐将ip地址转换为整数,用一个无符号的32位的整数存储. select INET_ATON( ...

最新文章

  1. SLAM精度测评——EVO
  2. MediaInfo+c#获取视频码率
  3. CSS基础(part19)--CSS3属性选择器
  4. 公有云与私有云的差别(转)
  5. Java关键字new和newInstance的区别
  6. ES6学习笔记(对象)
  7. java word 添加图片_java如何在word中添加图形?图文详解
  8. 解析局域网即时通讯软件安全吗
  9. Java数字图像处理基础-------Java Swing简单使用,图形绘画---画五角星
  10. 老男孩第58期马帅琦
  11. 查看已安装Tomcat的版本号
  12. 锐起无盘精华100问!(包括3.1,3.0版本)
  13. EEMD(集合经验模态分解)
  14. don't flush the Session after an exception occurs异常
  15. JAVA完整的银行存取系统
  16. 中国科技论文统计结果
  17. Softether详解(一)——V*N与softether概述
  18. 3dmax动画03--插值,超出范围
  19. Android开发之——Profiler-CPU性能分析
  20. 百度直播弹幕【点赞+分享+关注】小助手1.0

热门文章

  1. iphone 内部函数使用 (函数可能无法响应的部分解决方案)
  2. AnyForWeb告诉你什么才是“最好的”编程语言
  3. 【转】 Android xml中 @和?区别,style和attr小结
  4. 【短语学习】True(False) Positives (Negatives) 的含义和翻译
  5. 【转载】视频网站六间房将从200人减至60人裁员三分之二
  6. TextMate里添加Theme
  7. 阿里云容器服务Kubernetes之Jenkins X(1)-安装部署实践篇
  8. 解决Maven关于本地jar包的打包处理
  9. 详解微信扫码支付二-------新人的一些心得
  10. 从问题到解决方案到应用-android-ApiDemo入口源代码学习及应用