IP地址工具,判斷IP是否在指定范圍內(支持ipv6)

常用方法,判斷一個ip是否在指定的ip范圍內,范圍可能包括起始ip范圍或者掩碼形式,無其它依賴,

package com.yk.ip;import java.math.BigInteger;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;public class IpUtil {/*** 判斷目標ip是否在ip范圍內(起始ip范圍),支持ipv6* @param ipAddress 目標ip* @param startIp 開始ip* @param endIp 結束ip* @return boolean* @throws UnknownHostException 異常*/public static boolean isInRange(String ipAddress,String startIp,String endIp) throws UnknownHostException {InetAddress address = InetAddress.getByName(ipAddress);InetAddress startAddress = InetAddress.getByName(startIp);InetAddress endAddress = InetAddress.getByName(endIp);BigInteger start = new BigInteger(1, startAddress.getAddress());BigInteger end = new BigInteger(1, endAddress.getAddress());BigInteger target = new BigInteger(1, address.getAddress());int st = start.compareTo(target);int te = target.compareTo(end);return (st <= 0) && (te <= 0);}/*** 判斷目標ip是否在ip范圍內(掩碼),支持ipv6* @param ipAddress 目標ip* @param ipWithMask 帶掩碼ip* @return boolean* @throws UnknownHostException 異常*/public static boolean isInRange(String ipAddress,String ipWithMask) throws UnknownHostException {if (ipWithMask.contains("/")) {String addressPart = ipWithMask.substring(0, ipWithMask.indexOf("/"));String networkPart = ipWithMask.substring(ipWithMask.indexOf("/") + 1);ByteBuffer maskBuffer;int targetSize;InetAddress inetAddress = InetAddress.getByName(addressPart);if (inetAddress.getAddress().length == 4) {maskBuffer = ByteBuffer.allocate(4).putInt(-1);targetSize = 4;} else {maskBuffer = ByteBuffer.allocate(16).putLong(-1L).putLong(-1L);targetSize = 16;}BigInteger mask = (new BigInteger(1, maskBuffer.array())).not().shiftRight(Integer.parseInt(networkPart));ByteBuffer buffer = ByteBuffer.wrap(inetAddress.getAddress());BigInteger ipVal = new BigInteger(1, buffer.array());BigInteger startIp = ipVal.and(mask);BigInteger endIp = startIp.add(mask.not());byte[] startIpArr = toBytes(startIp.toByteArray(), targetSize);byte[] endIpArr = toBytes(endIp.toByteArray(), targetSize);InetAddress startAddress = InetAddress.getByAddress(startIpArr);InetAddress endAddress = InetAddress.getByAddress(endIpArr);return isInRange(ipAddress, startAddress.getHostAddress(), endAddress.getHostAddress());} else {throw new IllegalArgumentException("not an valid CIDR format!");}}private static byte[] toBytes(byte[] array, int targetSize) {int counter = 0;List<Byte> newArr = new ArrayList<Byte>();while (counter < targetSize && (array.length - 1 - counter >= 0)) {newArr.add(0, array[array.length - 1 - counter]);counter++;}int size = newArr.size();for (int i = 0; i < (targetSize - size); i++) {newArr.add(0, (byte) 0);}byte[] ret = new byte[newArr.size()];for (int i = 0; i < newArr.size(); i++) {ret[i] = newArr.get(i);}return ret;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714505.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714505.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714505.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統-文件原理

目錄 一、磁盤 1.1 磁盤結構 1. 盤片&#xff1a; 2. 盤面&#xff1a; 3. 磁頭&#xff1a; 4. 磁道&#xff1a; 5. 扇區&#xff1a; 6. 磁道密度和扇區密度&#xff1a; 1.2 磁盤訪問 1. 尋道&#xff08;Seeking&#xff09;&#xff1a; 2. 延遲旋轉&#xff…

C++進階-- map和set

關聯式容器 在前面&#xff0c;我們所學的vector、list、deque&#xff0c;這些都是序列容器&#xff0c;也就是底層為線性序列的數據結構。 而關聯式容器是C標準庫中的一種類別&#xff0c;用于存儲鍵值對&#xff08;key-value pair&#xff09;&#xff0c;關聯式容器中的元…

vxe-table編輯單元格動態插槽slot的使用

業務場景&#xff1a;表格中只有特定某一行的的單元格可以編輯&#xff0c;列很多&#xff0c;為每個列寫個插槽要寫很多重復代碼&#xff0c;所以這里使用動態插槽&#xff0c;簡化代碼量。顯示編輯圖標&#xff0c;點擊編輯圖標隱藏。失去焦點保存調后臺接口。 解決辦法&…

Linux多線程服務端編程:使用muduo C++網絡庫 學習筆記 附錄C 關于Boost的看法

這是作者為電子工業出版社出版的《Boost程序庫完全開發指南》寫的推薦序&#xff0c;此處節選了作者對在C工程項目中使用Boost的看法。 最近一年&#xff08;這篇文章寫于2010年8月&#xff09;作者電話面試了數十位C應聘者。慣用的暖場問題是“工作中使用過STL的哪些組件&…

十行代碼開發一個AI應用

Semantic Kernal 簡介 Semantic Kernel (SK) is a lightweight SDK that lets you easily mix conventional programming languages with the latest in Large Language Model (LLM) AI "prompts" with templating, chaining, and planning capabilities out-of-the-…

關于vue中關于eslint報錯的問題

1 代碼保存的時候會自動將單引號報錯為雙引號 導致eslint報錯的問題&#xff0c; 解決思路&#xff1a; 在項目根目錄下新建一個.prettierrc.json文件 { “tabWidth”: 2,“useTabs”: false,“singleQuote”: true,“semi”: false} 2 關于報錯代碼的時候 出現尾隨逗號報錯…

Zabbix 系統告警“More than 75% used in the configuration cache”處理辦法

Zabbix系統報錯提示 Zabbix 系統告警“More than 75% used in the configuration cache”&#xff0c;看了一下意思是可用的配置緩存超過75%。 修改緩存大小 vim /etc/zabbix/zabbix_server.confesc : /CacheSize 找到配置 將64M改大一點&#xff0c;保存退出。 重啟zabbix…

WPF常用mvvm開源框架介紹 vue的mvvm設計模式鼻祖

WPF&#xff08;Windows Presentation Foundation&#xff09;是一個用于構建桌面應用程序的.NET框架&#xff0c;它支持MVVM&#xff08;Model-View-ViewModel&#xff09;架構模式來分離UI邏輯和業務邏輯。以下是一些常用的WPF MVVM開源框架&#xff1a; Prism Prism是由微軟…

代碼隨想錄算法訓練營 Day32 | LeetCode122.買賣股票的最佳時機II、LeetCode55. 跳躍游戲、LeetCode45.跳躍游戲II

LeetCode122.買賣股票的最佳時機II 那么這里面根據貪心思想&#xff1a; 1、在最低點時買入&#xff0c;如果該點比上一點價格更低&#xff0c;只有兩種情況&#xff1a;上一點為買入點&#xff0c;則此時更新買入點&#xff1b;上一點不是買入點&#xff0c;則此時將股票賣出…

物聯網的核心技術有哪些?

物聯網的核心技術有哪些? 說起物聯網的相關技術&#xff0c;涉及到很多&#xff0c;比如自動識別技術、傳感器技術、網絡通信技術、云計算等&#xff0c;但說到核心技術&#xff0c;我認為有以下6個。這6個核心技術分別是感知和識別技術、物聯網設備硬件、通信技術、數據處理技…

【MySQL】數據庫中常用的函數

目錄 聚合函數COUNT()函數的多種用法COUNT(*)COUNT(主鍵)COUNT(1)COUNT(常量)COUNT(非主鍵)COUNT(distinct(字段)) COUNT()函數小結 字符函數length(str)函數&#xff1a;獲取參數值的字節個數concat(str1,str2,...)函數&#xff1a;字符串拼接upper(str)、lower(str)函數:大小…

Linux高負載排查最佳實踐

在Linux系統中&#xff0c;經常會因為負載過高導致各種性能問題。那么如何進行排查&#xff0c;其實是有跡可循&#xff0c;而且模式固定。 本次就來分享一下&#xff0c;CPU占用過高、磁盤IO占用過高的排查方法。 還是那句話&#xff0c;以最佳實踐入手&#xff0c;真傳一句話…

1 開源鴻蒙OpenHarmony niobe407 STM32F407IGT6芯片輕型系統全量源碼4.1版本下載流程

開源鴻蒙OpenHarmony niobe407 STM32F407IGT6芯片輕型系統全量源碼4.1版本下載流程 作者將狼才鯨日期2024-02-27 一、前景提要 如果通過DevEco Marketplace網站獲取下載源碼的話&#xff0c;不全&#xff0c;有些板子下不到&#xff1b;OpenHarmony開發板列表&#xff0c;官方…

數據庫-第二/三章 關系數據庫和標準語言SQL【期末復習|考研復習】

前言 總結整理不易&#xff0c;希望大家點贊收藏。 給大家整理了一下計數據庫系統概論中的重點概念&#xff0c;以供大家期末復習和考研復習的時候使用。 參考資料是王珊老師和薩師煊老師的數據庫系統概論(第五版)。 文章目錄 前言第二、三章 關系數據庫和標準語言SQL2.1 關系2…

JVM原理-基礎篇

Java虛擬機&#xff08;JVM, Java Virtual Machine&#xff09;是運行Java應用程序的核心組件&#xff0c;它是一個抽象化的計算機系統模型&#xff0c;為Java字節碼提供運行環境。JVM的主要功能包括&#xff1a;類加載機制、內存管理、垃圾回收、指令解釋與執行、異常處理與安…

React react.fragment和<>的使用及區別

React一個常用的模式是組件返回多個元素。Fragment可以為你的子元素分組而不需要在DOM上為它們添加額外的節點。 Fragment 使用 render() {return (<React.Fragment> <ChildA /> <ChildB /> <ChildC /> </React.Fragment> );}短語法使用 這里…

虛擬機內存不夠用了?全流程操作Look一下?

虛擬機信息&#xff1a;操作系統&#xff1a;CentOS Linux 7 (Core)&#xff0c;用的是VMware Workstation 16 Pro 版本16.2.3 build-19376536&#xff1b;我的主機 Windows 10 Education, 64-bit (Build 22000.1817) 10.0.22000 前言&#xff1a;虛擬機用久了就會出現內存不足…

代碼隨想錄算法訓練營Day37|738.單調遞增的數字、968.監控二叉樹

738.單調遞增的數字 題目鏈接&#xff1a;738.單調遞增的數字 文檔鏈接&#xff1a;738.單調遞增的數字 視頻鏈接&#xff1a;貪心算法&#xff0c;思路不難想&#xff0c;但代碼不好寫&#xff01;LeetCode:738.單調自增的數字 C實現 class Solution { public:int monotoneIn…

Rocky Linux 安裝部署 Zabbix 6.4

一、Zabbix的簡介 Zabbix是一種開源的企業級監控解決方案&#xff0c;用于實時監測服務器、網絡設備和應用程序的性能和可用性。它提供了強大的數據收集、處理和可視化功能&#xff0c;同時支持事件觸發、報警通知和自動化任務等功能。Zabbix易于安裝和配置&#xff0c;支持跨平…

6、Redis-KV設計、全局命令和安全性

目錄 一、value設計 二、Key設計 三、全局命令——針對所有key 四、安全性 一、value設計 ①是否需要排序&#xff1f;需要&#xff1a;Zset ②需要緩存的數據是單個值還是多個值&#xff1f; 單個值&#xff1a;簡單值---String&#xff1b;對象值---Hash多個值&#x…