Java如何获取一个IP段内的所有IP地址

 更新时间:2024年11月03日 14:33:33   作者:在天  
这篇文章主要为大家详细介绍了Java如何根据起始和结束的IP地址获取IP段内所有IP地址,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

现在有这样一个场景,提供一个起始的IP地址,提供一个结束的IP地址,要循环出IP段内所有的IP地址。

当然首先想到就是4个for循环。也是最简单的做法。现在肯定不会这样用。

再想到是通过2个循环或者1个函数调用来实现,因为对二进制的加减操作不熟悉,没有结果。

后来参考网络上的方法,出了1个个人认为较好的解决方案。

 using System;
 using System.Collections;
 
  namespace ConsoleApplicationForTest
  {
      class Program
      {
          static void Main(string[] args)
          {
            string startIP = "10.1.1.1";
             string endIP = "10.2.3.4";
 
             long lsIP = ToHex(startIP);
             long leIP = ToHex(endIP);
 
             SortedList list = new SortedList();
 
             for (; lsIP < leIP; lsIP++)
             {
                 string temp = ToIp(lsIP);
                 list.Add(temp, temp);
             }
         }
 
         /// <summary>
 /// 将IP地址转换成数值形式
 /// </summary>
 /// <param name="ip"></param>
 /// <returns>长整形</returns>
         public static long ToHex(string ip)
         {
             string[] arrIP = ip.Split('.');
             for (int i = 0; i < arrIP.Length; i++)
             {
                 arrIP[i] = int.Parse(arrIP[i]) > 255 ? Convert.ToString(255).PadLeft(2, '0') : arrIP[i] = Convert.ToString(int.Parse(arrIP[i]), 16).PadLeft(2, '0');
             }
             ip = string.Join("", arrIP);
 
             long hexIP = long.Parse(ip, System.Globalization.NumberStyles.HexNumber);
             return hexIP;
         }
 
         /// <summary>
 /// 将数值形式转换成IP地址
 /// </summary>
 /// <param name="l"></param>
 /// <returns>IP地址</returns>
         public static string ToIp(long l)
         {
             var bt = new long[4];
             for (int i = 0; i < 4; i++)
             {
                 bt[3 - i] = (long)(l >> 8 * i & 255);
             }
 
             string ipAddress = string.Join(".", bt);
             return ipAddress;
         }
     }
60 }

下面这个是同事给的一个Class

using System;
using System.Net;
  
  namespace ConsoleApplicationForTest
  {
      public class IpDigitCovert
      {
          /// <summary>
  /// 将IP地址转为数值形式
 /// </summary>
 /// <returns>长整数</returns>
         public static long ToDigit(IPAddress ip)
         {
             int x = 3;
             long l = 0;
             foreach (byte b in ip.GetAddressBytes())
             {
                 l += (long)b << 8 * x;
             }
             return l;
         }

         /// <summary>
/// 将数值转换为IP地址
 /// </summary>
 /// <returns>IP地址</returns>
         public static IPAddress ToIP(long l)
         {
             var bt = new byte[4];
             for (int i = 0; i < 4; i++)
             {
                 bt[3 - i] = (byte)(l >> 8 * i & 255);
             }
            return new IPAddress(bt);
         }
 
         /// <summary>
 /// 将IP地址转为数值形式
 /// </summary>
 /// <param name="ip"></param>
 /// <returns>长整数</returns>
         public static long ToHex(string ip)
         {
             string[] arrIP = ip.Split('.');
             for (int i = 0; i < arrIP.Length; i++)
             {
                 arrIP[i] = int.Parse(arrIP[i]) > 255 ? Convert.ToString(255).PadLeft(2, '0') : arrIP[i] = Convert.ToString(int.Parse(arrIP[i]), 16).PadLeft(2, '0');
             }
             ip = string.Join("", arrIP);

             long hexIP = long.Parse(ip, System.Globalization.NumberStyles.HexNumber);
             return hexIP;
         }
 
         /// <summary>
 /// 将数值形式转为IP地址
 /// </summary>
 /// <param name="l"></param>
 /// <returns>ip地址</returns>
         public static string ToIp(long l)
         {
             var bt = new long[4];
             for (int i = 0; i < 4; i++)
             {
                 bt[3 - i] = (long)(l >> 8 * i & 255);
             }
             string ipAddress = string.Join(".", bt);
             return ipAddress;
         }
 
     }
 }

方法补充

除了上文的方法,小编还为大家整理了其他根据开始和结束ip计算中间的所有ip的方法,希望对大家有所帮助

import java.util.ArrayList;
import java.util.List;
import java.net.InetAddress;
import java.io.UnsupportedEncodingException;
 
public class IpRangeCalculator {
    public static String[] calculateIpRange(String startIp, String endIp) {
        try {
            InetAddress startInetAddress = InetAddress.getByName(startIp);
            InetAddress endInetAddress = InetAddress.getByName(endIp);
 
            byte[] startBytes = startInetAddress.getAddress();
            byte[] endBytes = endInetAddress.getAddress();
 
            List<String> ipList = new ArrayList<>();
 
            for (int i = 0; i < startBytes.length; i++) {
                for (int j = Integer.parseInt(startIp.split("\\.")[i]); j < Integer.parseInt(endIp.split("\\.")[i]); j++) {
                    byte[] tempBytes = startBytes.clone();
                    tempBytes[i] = (byte) j;
                    ipList.add(InetAddress.getByAddress(tempBytes).getHostAddress());
                }
            }
 
            return ipList.toArray(new String[0]);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
 
    public static void main(String[] args) {
        String startIp = "192.168.1.1";
        String endIp = "192.168.1.5";
        String[] ipRange = calculateIpRange(startIp, endIp);
 
        for (String ip : ipRange) {
            System.out.println(ip);
        }
    }
}

这个方法首先将起始IP地址和结束IP地址转换为InetAddress对象,然后获取它们的字节数组表示。对于IP地址的每个字节,它会遍历可能的值,为每个字节创建一个新的字节数组,并将其转换回IP地址,添加到结果列表中。最后,将列表转换为字符串数组并返回。

到此这篇关于Java如何获取一个IP段内的所有IP地址的文章就介绍到这了,更多相关Java获取IP段内所有IP地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java统计代码的执行时间的N种方法

    Java统计代码的执行时间的N种方法

    在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Java 中比较常用的执行时间统计方法,总共包含以下 6 种,需要的朋友可以参考下
    2022-08-08
  • RabbitMQ消息确认机制剖析

    RabbitMQ消息确认机制剖析

    这篇文章主要为大家介绍了RabbitMQ消息确认机制剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • spring boot整合redis实现shiro的分布式session共享的方法

    spring boot整合redis实现shiro的分布式session共享的方法

    本篇文章主要介绍了spring boot整合redis实现shiro的分布式session共享的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • spring注解 @Valid 的作用说明

    spring注解 @Valid 的作用说明

    这篇文章主要介绍了spring注解 @Valid 的作用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • springboot项目整合mybatis并配置mybatis中间件的实现

    springboot项目整合mybatis并配置mybatis中间件的实现

    这篇文章主要介绍了springboot项目整合mybatis并配置mybatis中间件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 使用Java7的Files工具类和Path接口来访问文件的方法

    使用Java7的Files工具类和Path接口来访问文件的方法

    下面小编就为大家分享一篇使用Java7的Files工具类和Path接口来访问文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • Java 的可变参数方法详述

    Java 的可变参数方法详述

    这篇文章主要介绍了Java 的可变参数方法,可变参数只能作为函数的最后一个参数,在其前面可以有也可以没有任何其他参数,由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数,下面我们一起进入文章了解更多关于可变参数的内容吧
    2022-02-02
  • Java 中的5个代码性能提升技巧

    Java 中的5个代码性能提升技巧

    这篇文章主要给大家分享了Java的5个代码性能提升的技巧,虽然大多数情况下极致优化代码是没有必要的,但是作为一名技术开发者,我们还是想追求代码的更小、更快,更强。如果哪天发现程序的运行速度不尽人意,就需要这样的文章了,需要的朋友可以参考一下
    2021-12-12
  • springboot整合消息队列RabbitMQ

    springboot整合消息队列RabbitMQ

    这篇文章主要介绍了springboot整合消息队列RabbitMQ,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • SpringBoot大事务问题的常用优化方案

    SpringBoot大事务问题的常用优化方案

    大事务是指运行时间比较长,操作的数据比较多的事务123,大事务的产生原因包括操作的数据比较多、大量的锁竞争、事务中有其他非数据库的耗时操作等,本文给大家总结了SpringBoot大事务问题的常用优化方案,需要的朋友可以参考下
    2024-04-04

最新评论