Java 快速判断一个 IP 是否在给定的网段内

news2024/11/26 5:52:27

目录

  • 方法一:借助于 Java 提供的 InetAddress
  • 方法二:撸个算法实现(二进制计算)
  • 其他
    • 数字转为子网掩码

要在Java中判断一个IP地址是否在给定的网段内,可以使用子网掩码IP地址子网掩码进行与操作来提取网络地址,并将其与给定的子网地址进行比较。

方法一:借助于 Java 提供的 InetAddress

下面的例子由强大的 ChatGPT 提供

在这里插入图片描述

代码如下所示(子网掩码的计算可以截取字符串后,借助底部的算法进行获得):

public static boolean isIpAddressInSubnet(String ipAddress, String subnetAddress, String subnetMask) throws UnknownHostException {
    InetAddress inetAddress = InetAddress.getByName(ipAddress);
    InetAddress subnet = InetAddress.getByName(subnetAddress);
    InetAddress mask = InetAddress.getByName(subnetMask);

    byte[] inetAddressBytes = inetAddress.getAddress();
    byte[] subnetBytes = subnet.getAddress();
    byte[] maskBytes = mask.getAddress();

    for (int i = 0; i < inetAddressBytes.length; i++) {
        int addressByte = inetAddressBytes[i] & 0xFF;
        int subnetByte = subnetBytes[i] & 0xFF;
        int maskByte = maskBytes[i] & 0xFF;

        if ((addressByte & maskByte) != (subnetByte & maskByte)) {
            return false;
        }
    }

    return true;
}

这个方法接受三个参数:要检查的IP地址子网地址子网掩码。它使用InetAddress类将这些字符串转换为Java对象,然后将它们转换为字节数组。然后,它迭代每个字节,并将每个字节的值与相应的子网字节和掩码字节进行比较,以提取网络地址。如果网络地址与子网地址不匹配,则返回false,否则返回true

例如,假设我们要检查IP地址 “192.168.1.100” 是否在子网"192.168.1.0/24"中:

boolean result = isIpAddressInSubnet("192.168.1.100", "192.168.1.0", "255.255.255.0");
if (result) {
    System.out.println("IP address is in subnet");
} else {
    System.out.println("IP address is not in subnet");
}

方法二:撸个算法实现(二进制计算)

代码来源于 Google,但是明白原理即可,不需要深究。不管怎么样肯定都会需要 IP 地址子网掩码才能组成一个子网范围;然后判断另一个给定的 IP 是否在这个网段内。

/**
 * 判断是否在该网段中
 *
 * @param subnetRange 子网范围 x.x.x.x/xx 形式
 */
public static boolean isIpAddressInSubnet(String ipAddress, String subnetRange) {
    String[] networkips = ipAddress.split("\\.");
    int ipAddr = (Integer.parseInt(networkips[0]) << 24)
            | (Integer.parseInt(networkips[1]) << 16)
            | (Integer.parseInt(networkips[2]) << 8)
            | Integer.parseInt(networkips[3]);
            
    // 拿到主机数       
    int type = Integer.parseInt(subnetRange.replaceAll(".*/", ""));
    int ipCount = 0xFFFFFFFF << (32 - type);
    
    String maskIp = subnetRange.replaceAll("/.*", "");
    String[] maskIps = maskIp.split("\\.");
    
    int cidrIpAddr = (Integer.parseInt(maskIps[0]) << 24)
            | (Integer.parseInt(maskIps[1]) << 16)
            | (Integer.parseInt(maskIps[2]) << 8)
            | Integer.parseInt(maskIps[3]);
            
    return (ipAddr & ipCount) == (cidrIpAddr & ipCount);
}

例如,假设我们要检查IP地址 “192.168.1.100” 是否在子网"192.168.1.0/24"中:

boolean result = isIpAddressInSubnet("192.168.1.100", "192.168.1.0/24");
if (result) {
    System.out.println("IP address is in subnet");
} else {
    System.out.println("IP address is not in subnet");
}

其他

数字转为子网掩码

public static String subnetMaskFromPrefixLength(int prefixLength) {
    if (prefixLength < 0 || prefixLength > 32) {
        throw new IllegalArgumentException("Invalid prefix length");
    }

    int mask = 0xffffffff << (32 - prefixLength);
    return String.format("%d.%d.%d.%d",
        (mask & 0xff000000) >>> 24,
        (mask & 0x00ff0000) >>> 16,
        (mask & 0x0000ff00) >>> 8,
        (mask & 0x000000ff));
}

示例:

String subnetMask = subnetMaskFromPrefixLength(24);
System.out.println(subnetMask); // 输出:255.255.255.0

个人博客: Roc’s Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络入门

一&#xff0c;计算机网络在信息时代中的作用 21世纪的一些重要特征就是数字化&#xff0c;网络化和信息化&#xff0c;它是一个以网络为核心的信息时代。有三类大家很熟悉的网络&#xff0c;即电信网络&#xff0c;有线电视网络和计算机网络。按照最初的服务分工&#xff0c;…

GB28181-2022注册注销基本要求、注册重定向解读和技术实现

规范解读GB28181-2022注册、注销基本要求相对GB28181-2016版本&#xff0c;做了一定的调整&#xff0c;新调整的部分如下&#xff1a;——更改了注册和注销基本要求&#xff08;见 9.1.1&#xff0c;2016 年版的 9.1.1&#xff09;。1.增加对NAT模式网络传输要求&#xff0c;宜…

Vulnhub 渗透练习(一)—— Breach 1.0

环境搭建 环境下载&#xff1a; https://www.vulnhub.com/entry/breach-1,152/ 环境描述&#xff1a; Vulnhub 中对此环境的描述&#xff1a; VM 配置有静态 IP 地址 (192.168.110.140)&#xff0c;因此您需要将仅主机适配器配置到该子网。 这里我用的是 VMware &#xff0…

零信任-腾讯零信任iOA介绍(4)

​腾讯零信任介绍 腾讯零信任是一种信息安全架构&#xff0c;旨在通过限制对计算设备、数据和应用程序的访问来保护敏感信息。腾讯零信任的主要思想是&#xff0c;任何计算设备、数据或应用程序都不应被自动信任&#xff0c;并需要经过授权后才能访问敏感信息。 腾讯零信任的…

MyBatis的工作原理

1、读取MyBatis 配置文件&#xff1a;mybatis-config.xml 为MyBatis 的全局配置文件&#xff0c;配置了MyBatis 的运行环境等信息&#xff0c;例如数据库连接信息。 2、加载映射文件。映射文件即SQL 映射文件&#xff0c;该文件中配置了操作数据库的SQL 语句&#xff0c;需要在…

运动耳机买什么样的好、最好用的运动耳机排行榜

2月中旬&#xff0c;气温回暖&#xff0c;路面冰雪融化&#xff0c;又到了运动的好时节。难道还要每天上下班后就回家躺着嘛&#xff0c;浪费时间可耻&#xff0c;为什么不做一些更有意义的事情呢&#xff1f;即刻出发&#xff0c;开始空余&#xff0c;享受运动锻炼的乐趣&…

如何开发一个小游戏?其中有什么难点

如果仅仅针对个人开发者来讲&#xff0c;要独立开发一款大型游戏几乎无可能&#xff0c;更大成功的可能还是开发一款类似《羊了个羊》这样洗脑的小程序游戏。 所以这里主要论述小游戏开发的情况&#xff0c;也就是小程序游戏&#xff0c;首先从小游戏的开发流程来看&#xff1…

大数据之-Nifi-认识Nifi_Nifi的核心概念_Nifi核心架构_Nifi的性能_Nifi的关键特性---大数据之Nifi工作笔记0001

用来管理不同系统之间的信息流的工具. ETL工具 kettle是数据的转换 比如kettle来说,如果需要做ETL的数据特别大量特别多,他就会支持不了数据的转换会有崩溃的现象 可以看到nifi解决的是dataflow的问题,解决的是数据流的问题 可以看到Nifi的用处,用来处理数据的分发,是BS架构…

jenkins实现接口自动化持续集成(python+pytest+ Allure+git)

在用python做自动化测试时&#xff0c;我们写好代码&#xff0c;然后需要执行才能得到测试报告&#xff0c;这时我们可以通过 Jenkins 来进一步完成自动化工作。借助Jenkins&#xff0c;我们可以结合 Git/SVN 自动拉取代码&#xff0c;通过设置定时构建实现自动触发脚本执行&am…

1.6实验6:配置多区域OSPF

1.4.1实验6:配置多区域OSPF 实验需求实现OSPF多区域配置阐明OSPF的LSA的类型阐明OSPF引入外部路由的配置方法阐明向OSPF引入缺省路由的方法实验拓扑配置多区域OSPF如图1-16所示。 图1-16 配置多区域OSPF 实验步骤[1] IP地址配置

Seata源码学习(二)-源码入口

Seata源码剖析-源码入口 Seata客户端启动 首先一个Seata的客户端启动一般分为几个流程&#xff1a; 自动加载各种Bean及配置信息初始化TM初始化RM&#xff08;具体服务&#xff09;初始化分布式事务客户端完成&#xff0c;代理数据源连接TC&#xff08;Seata服务端&#xff…

第三部分:(主从)复合句——第二章:定语从句

若多件事不一样重要&#xff0c;连接到一块就构成了主从复合句&#xff0c;主要的事情写成主句&#xff0c;次要的事情写成从句&#xff0c;从句虽然不是主要描述的事情&#xff0c;但从句是考试常考的地方&#xff0c;从句有很多复杂的变化&#xff0c;前面需要加上一些连接词…

118.(leaflet篇)leaflet空间判断-点与geojson面图层的空间关系(turf实现)

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

【算法自由之路】 贪心算法

贪心算法 局部最右得到全局最右难点在于如何证明局部最优可以得到全局最优堆 和 排序 是贪心算法最常用的实现算法 贪心算法作为最符合自然智慧的算法&#xff0c;思路是从小部分取最优从而获得最终的最优&#xff0c;但是难得是怎样获取部分最优才能得到全局最优。 有时候我…

9个EXCEL舍入函数公式的用法和实例

用法和实例 1. ROUND ROUND函数可以将数字四舍五入到指定的小数位数。 语法&#xff1a;ROUND(number, num_digits) number&#xff1a;要四舍五入的数字。 num_digits&#xff1a;要保留的小数位数。 举例&#xff1a; ROUND(3.14159,2)&#xff0c;结果为3.14 ROUND(3.141…

如何在Excel中向下拉列表中添加条件

在Excel中向下拉列表中添加条件 创建矩阵型数据集创建下拉列表创建第一个下拉列表创建第二个下拉列表你可以使用Microsoft Excel下拉列表来显示一个简单的列表,尽管有时需要更多的控制。假设你的人员分散在四个地区:北部、南部、东部和西部。你希望按地区与人员合作,而不是与…

界面组件DevExpress Reporting v22.2 - 增强的Web报表组件UI

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。DevExpress Reporting v22.2版本已正式发布&…

【LeetCode】剑指 Offer 04. 二维数组中的查找 p44 -- Java Version

题目链接&#xff1a; https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 1. 题目介绍&#xff08;04. 二维数组中的查找&#xff09; 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右 非递减 的顺序排序&#xff0c;每一列都按照从上到下 非递…

为什么要有分布式锁?

Redis避坑指南&#xff1a;为什么要有分布式锁&#xff1f;作者&#xff1a;京东保险 张江涛1、为什么要有分布式锁&#xff1f;JUC提供的锁机制&#xff0c;可以保证在同一个JVM进程中同一时刻只有一个线程执行操作逻辑&#xff1b;多服务多节点的情况下&#xff0c;就意味着有…

2023最新Java面试手册(性能优化+微服务架构+并发编程+开源框架)

Java面试手册 一、性能优化面试专栏 1.1、 tomcat性能优化整理 1.2、JVM性能优化整理 1.3、Mysql性能优化整理 二、微服务架构面试专栏 2.1、SpringCloud面试整理 2.2、SpringBoot面试整理 2.3、Dubbo面试整理 三、并发编程高级面试专栏 四、开源框架面试题专栏 4.1、Sprin…