Java实现ip地址和int数字的相互转换

 更新时间:2020年09月14日 15:04:40   作者:laosun  
这篇文章主要介绍了Java实现ip地址和int数字的相互转换,帮助大家更好的利用Java处理数据,感兴趣的朋友可以了解下

Java版本的 ip地址和int数字的相互转换

对于ipv4的地址来说,如果用字符串的形式存储的话,其占用字节就比较大,比如对于IPv4地址0.0.0.0的字符串,就需要7个字节,IPv4为255.255.255.255 的字符串,需要15个字节,也就是说存储一个ip需要占用7~15个字节。

那么有没有更节省空间的存储方式呢?答案是有。

方案1:

直接把字符串中的'.'去掉,不就变成一个数字了嘛,比如 "255.255.255.255" 变成 255255255255,然而我们知道int所能表示的最大值 = Integer.MAX_VALUE = 2^31-1 = 2147483647, 255255255255 > 2^31-1,所以需要用长整形long来表示,长整形占用8个字节,也就是说我们将7~15个字节转换为8字节,在绝大多数情况下是节省空间了的。

方案2:

因为考虑到IPv4的地址本质上就是32位的二进制串,而一个int类型的数字刚好为4个字节32个bit位,所以刚好可以用一个int类型的数字转表示IPv4地址。所以,我们可以用4个字节的int数字表示一个ip地址,这样可以大大节省空间。

这里只讨论方案2 :)

演示

对于ipv4地址: 192.168.1.3:

每段都用二进制表示: 192(10) = 11000000(2) ; 168(10) = 10101000(2) ; 1(10) = 00000001(2) ; 3(10) = 00000011(2) 。

所以连在一起就是:11000000101010000000000100000011,对应的int数字就是-1062731775 。

具体算法分析:

192左移24位: 11000000 00000000 00000000 00000000

168左移16位: 00000000 10101000 00000000 00000000

001左移08位: 00000000 00000000 00000001 00000000

003左移00位: 00000000 00000000 00000000 00000011

按位或结果 : 11000000 10101000 00000001 00000011

即 -1062731775

将int类型的数字转换成ip地址,其实就是上述过程的逆过程,这里就不再赘述。

具体实现方式:

package com.sunjs.kit;
 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 * IPv4地址和int数字的互换
 * @author sun
 */
public class IpKit {
 
  /**
   * IPv4地址转换为int类型数字
   * @param ipv4Addr
   * @return
   */
  public static int ipToInt(String ipv4Addr) {
    // 判断是否是ip格式的
    if (!isIPv4Address(ipv4Addr))
      throw new RuntimeException("Invalid ip address");
 
    // 匹配数字
    Pattern pattern = Pattern.compile("\\d+");
    Matcher matcher = pattern.matcher(ipv4Addr);
    int result = 0;
    int counter = 0;
    while (matcher.find()) {
      int value = Integer.parseInt(matcher.group());
      result = (value << 8 * (3 - counter++)) | result;
    }
    return result;
  }
 
  /**
   * 判断是否为ipv4地址
   * @param ipv4Addr
   * @return
   */
  private static boolean isIPv4Address(String ipv4Addr) {
    String lower = "(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])"; // 0-255的数字
    String regex = lower + "(\\." + lower + "){3}";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(ipv4Addr);
    return matcher.matches();
  }
   
  /**
   * 将int数字转换成ipv4地址
   * @param ip
   * @return
   */
  public static String intToIp(int ip) {
    StringBuilder sb = new StringBuilder();
    int num = 0;
    boolean needPoint = false; // 是否需要加入'.'
    for (int i = 0; i < 4; i++) {
      if (needPoint) {
        sb.append('.');
      }
      needPoint = true;
      int offset = 8 * (3 - i);
      num = (ip >> offset) & 0xff;
      sb.append(num);
    }
    return sb.toString();
  }
   
  public static void main(String[] args) {
    String ip = "124.202.200.166";
  System.out.println(ipToInt(ip));
  System.out.println(intToIp(2093664422));
  }
   
}

以上就是Java实现ip地址和int数字的相互转换的详细内容,更多关于Java ip和数字相互转换的资料请关注脚本之家其它相关文章!

相关文章

  • 详解SpringBoot 应用如何提高服务吞吐量

    详解SpringBoot 应用如何提高服务吞吐量

    这篇文章主要介绍了Spring Boot 应用如何提高服务吞吐量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 详解Spring-boot中读取config配置文件的两种方式

    详解Spring-boot中读取config配置文件的两种方式

    这篇文章主要介绍了详解Spring-boot中读取config配置文件的两种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • JDBC SQL语法

    JDBC SQL语法

    结构化查询语言(SQL)是一种标准化的语言,它允许你在数据库上执行操作,如创建项目,读取内容,内容更新和删除条目
    2014-03-03
  • Java实现对中文字符串的排序功能实例代码

    Java实现对中文字符串的排序功能实例代码

    这篇文章主要介绍了Java实现中文字符串的排序功能实例代码的相关资料,需要的朋友可以参考下
    2016-04-04
  • Java后台实现微信支付和微信退款

    Java后台实现微信支付和微信退款

    这篇文章主要介绍了Java后台实现微信支付和微信退款,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 详解Java编程中对线程的中断处理

    详解Java编程中对线程的中断处理

    这篇文章主要介绍了Java编程中对线程的中断处理,特别讲解了中断的时机与中断状态的管理,需要的朋友可以参考下
    2015-11-11
  • java解析xml之dom4j解析xml示例分享

    java解析xml之dom4j解析xml示例分享

    DOM4J具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml,dom4j是一套开源的api。实际项目中,往往选择dom4j来作为解析xml的利器
    2014-01-01
  • Java中使用JWT生成Token进行接口鉴权实现方法

    Java中使用JWT生成Token进行接口鉴权实现方法

    这篇文章主要介绍了Java中使用JWT生成Token进行接口鉴权实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • JavaWeb如何实现禁用浏览器缓存

    JavaWeb如何实现禁用浏览器缓存

    这篇文章主要介绍了JavaWeb如何实现禁用浏览器缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java中实现Comparable和Comparator对象比较

    Java中实现Comparable和Comparator对象比较

    这篇文章主要针对Java中Comparable和Comparator对象进行比较,感兴趣的小伙伴们可以参考一下
    2016-02-02

最新评论