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地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用gRPC微服务的内部通信优化

    使用gRPC微服务的内部通信优化

    这篇文章主要为大家介绍了微服务优化之使用gRPC做微服务的内部通信,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 在Struts2中的结果集类型

    在Struts2中的结果集类型

    本篇文章,小编为大家介绍关于在Struts2中的结果集类型,有需要的朋友可以参考一下
    2013-04-04
  • SpringBoot之Java配置的实现

    SpringBoot之Java配置的实现

    这篇文章主要介绍了SpringBoot之Java配置的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • vue+ java 实现多级菜单递归效果

    vue+ java 实现多级菜单递归效果

    这篇文章主要介绍了vue+ java 实现多级菜单递归效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • 关于Java中拦截mybatis并输出完整sql语句的方法

    关于Java中拦截mybatis并输出完整sql语句的方法

    这篇文章主要介绍了关于Java中拦截mybatis并输出完整sql语句的方法,假如项目中有很多很多的SQL我们不可能一一的去修改解决。这个时候我们就需要通过mybatis拦截SQL并且最终修改SQL,需要的朋友可以参考下
    2023-08-08
  • Java中LocalDate的详细方法举例总结

    Java中LocalDate的详细方法举例总结

    这篇文章主要给大家介绍了关于Java中LocalDate详细方法举例的相关资料,LocalDate主要是用来处理日期的类,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • SpringBoot如何从配置文件中读取配置参数

    SpringBoot如何从配置文件中读取配置参数

    这篇文章主要介绍了SpringBoot如何从配置文件中读取配置参数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java 快速排序(QuickSort)原理及实现代码

    Java 快速排序(QuickSort)原理及实现代码

    这篇文章主要介绍了Java 快速排序(QuickSort)原理及实现代码,有需要的朋友可以参考一下
    2014-01-01
  • JRebel2023.3 插件使用及安装步骤详解

    JRebel2023.3 插件使用及安装步骤详解

    JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效,IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效,浪费时间浪费生命,目前对于idea热部署最好的解决方案就是安装JRebel插件,本文分步骤介绍的非常详细,一起看看吧
    2023-08-08
  • SpringBoot实现RBAC权限校验模型的示例

    SpringBoot实现RBAC权限校验模型的示例

    本文主要介绍了SpringBoot实现RBAC权限校验模型的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04

最新评论