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基础详细笔记之异常处理

    java基础详细笔记之异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的,下面这篇文章主要给大家介绍了关于java基础详细笔记之异常处理的相关资料,需要的朋友可以参考下
    2022-03-03
  • Java SpringBoot @Async实现异步任务的流程分析

    Java SpringBoot @Async实现异步任务的流程分析

    这篇文章主要介绍了Java SpringBoot @Async实现异步任务,主要包括@Async 异步任务-无返回值,@Async 异步任务-有返回值,@Async + 自定义线程池的操作代码,需要的朋友可以参考下
    2022-12-12
  • MyBatis传入多个参数时parameterType的写法

    MyBatis传入多个参数时parameterType的写法

    这篇文章主要介绍了MyBatis传入多个参数时parameterType的写法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 关于Java8新特性Optional类的详细解读

    关于Java8新特性Optional类的详细解读

    Optional类是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在,原来用 null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常,需要的朋友可以参考下
    2023-05-05
  • Android应用开发的一般文件组织结构讲解

    Android应用开发的一般文件组织结构讲解

    这篇文章主要介绍了Android应用开发的一般文件组织结构讲解,同时附带介绍了一个获取Android的文件列表的方法,需要的朋友可以参考下
    2015-12-12
  • springboot2.1.3配置sftp自定义sftp连接池的详细过程

    springboot2.1.3配置sftp自定义sftp连接池的详细过程

    这篇文章主要介绍了springboot2.1.3配置sftp自定义sftp连接池的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Spring Security OAuth2 实现登录互踢的示例代码

    Spring Security OAuth2 实现登录互踢的示例代码

    这篇文章主要介绍了Spring Security OAuth2实现登录互踢的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 利用Java查看进程内存占用情况的实现方法

    利用Java查看进程内存占用情况的实现方法

    在系统监控和性能调优中,了解各个进程的内存占用情况是非常重要的一环,通过查看进程内存使用情况,开发者和运维人员可以及时发现异常进程、资源瓶颈和内存泄漏问题,本项目旨在使用 Java 编写一个简单的程序,通过调用操作系统的命令来获取系统中各个进程的内存使用情况
    2025-03-03
  • socket编程时的发送与接收数据时的问题解析

    socket编程时的发送与接收数据时的问题解析

    这篇文章主要为大家介绍了socket编程时的发送与接收数据时的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java加密解密工具(适用于JavaSE/JavaEE/Android)

    Java加密解密工具(适用于JavaSE/JavaEE/Android)

    这篇文章主要介绍了Java加密解密工具,适用于JavaSE/JavaEE/Android,感兴趣的小伙伴们可以参考一下
    2016-04-04

最新评论