Java如何獲取一個IP段內(nèi)的所有IP地址
現(xiàn)在有這樣一個場景,提供一個起始的IP地址,提供一個結(jié)束的IP地址,要循環(huán)出IP段內(nèi)所有的IP地址。
當然首先想到就是4個for循環(huán)。也是最簡單的做法?,F(xiàn)在肯定不會這樣用。
再想到是通過2個循環(huán)或者1個函數(shù)調(diào)用來實現(xiàn),因為對二進制的加減操作不熟悉,沒有結(jié)果。
后來參考網(wǎng)絡上的方法,出了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地址轉(zhuǎn)換成數(shù)值形式 /// </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> /// 將數(shù)值形式轉(zhuǎn)換成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地址轉(zhuǎn)為數(shù)值形式 /// </summary> /// <returns>長整數(shù)</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> /// 將數(shù)值轉(zhuǎn)換為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地址轉(zhuǎn)為數(shù)值形式 /// </summary> /// <param name="ip"></param> /// <returns>長整數(shù)</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> /// 將數(shù)值形式轉(zhuǎn)為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; } } }
方法補充
除了上文的方法,小編還為大家整理了其他根據(jù)開始和結(jié)束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地址和結(jié)束IP地址轉(zhuǎn)換為InetAddress對象,然后獲取它們的字節(jié)數(shù)組表示。對于IP地址的每個字節(jié),它會遍歷可能的值,為每個字節(jié)創(chuàng)建一個新的字節(jié)數(shù)組,并將其轉(zhuǎn)換回IP地址,添加到結(jié)果列表中。最后,將列表轉(zhuǎn)換為字符串數(shù)組并返回。
到此這篇關于Java如何獲取一個IP段內(nèi)的所有IP地址的文章就介紹到這了,更多相關Java獲取IP段內(nèi)所有IP地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java?SpringBoot?@Async實現(xiàn)異步任務的流程分析
這篇文章主要介紹了Java?SpringBoot?@Async實現(xiàn)異步任務,主要包括@Async?異步任務-無返回值,@Async?異步任務-有返回值,@Async?+?自定義線程池的操作代碼,需要的朋友可以參考下2022-12-12MyBatis傳入多個參數(shù)時parameterType的寫法
這篇文章主要介紹了MyBatis傳入多個參數(shù)時parameterType的寫法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Android應用開發(fā)的一般文件組織結(jié)構(gòu)講解
這篇文章主要介紹了Android應用開發(fā)的一般文件組織結(jié)構(gòu)講解,同時附帶介紹了一個獲取Android的文件列表的方法,需要的朋友可以參考下2015-12-12springboot2.1.3配置sftp自定義sftp連接池的詳細過程
這篇文章主要介紹了springboot2.1.3配置sftp自定義sftp連接池的詳細過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08Spring Security OAuth2 實現(xiàn)登錄互踢的示例代碼
這篇文章主要介紹了Spring Security OAuth2實現(xiàn)登錄互踢的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04利用Java查看進程內(nèi)存占用情況的實現(xiàn)方法
在系統(tǒng)監(jiān)控和性能調(diào)優(yōu)中,了解各個進程的內(nèi)存占用情況是非常重要的一環(huán),通過查看進程內(nèi)存使用情況,開發(fā)者和運維人員可以及時發(fā)現(xiàn)異常進程、資源瓶頸和內(nèi)存泄漏問題,本項目旨在使用 Java 編寫一個簡單的程序,通過調(diào)用操作系統(tǒng)的命令來獲取系統(tǒng)中各個進程的內(nèi)存使用情況2025-03-03socket編程時的發(fā)送與接收數(shù)據(jù)時的問題解析
這篇文章主要為大家介紹了socket編程時的發(fā)送與接收數(shù)據(jù)時的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06Java加密解密工具(適用于JavaSE/JavaEE/Android)
這篇文章主要介紹了Java加密解密工具,適用于JavaSE/JavaEE/Android,感興趣的小伙伴們可以參考一下2016-04-04