Java如何獲取一個(gè)IP段內(nèi)的所有IP地址
現(xiàn)在有這樣一個(gè)場(chǎng)景,提供一個(gè)起始的IP地址,提供一個(gè)結(jié)束的IP地址,要循環(huán)出IP段內(nèi)所有的IP地址。
當(dāng)然首先想到就是4個(gè)for循環(huán)。也是最簡(jiǎn)單的做法?,F(xiàn)在肯定不會(huì)這樣用。
再想到是通過(guò)2個(gè)循環(huán)或者1個(gè)函數(shù)調(diào)用來(lái)實(shí)現(xiàn),因?yàn)閷?duì)二進(jìn)制的加減操作不熟悉,沒(méi)有結(jié)果。
后來(lái)參考網(wǎng)絡(luò)上的方法,出了1個(gè)個(gè)人認(rèn)為較好的解決方案。
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>長(zhǎng)整形</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 }下面這個(gè)是同事給的一個(gè)Class
using System;
using System.Net;
namespace ConsoleApplicationForTest
{
public class IpDigitCovert
{
/// <summary>
/// 將IP地址轉(zhuǎn)為數(shù)值形式
/// </summary>
/// <returns>長(zhǎng)整數(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>長(zhǎng)整數(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;
}
}
}方法補(bǔ)充
除了上文的方法,小編還為大家整理了其他根據(jù)開(kāi)始和結(jié)束ip計(jì)算中間的所有ip的方法,希望對(duì)大家有所幫助
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);
}
}
}
這個(gè)方法首先將起始IP地址和結(jié)束IP地址轉(zhuǎn)換為InetAddress對(duì)象,然后獲取它們的字節(jié)數(shù)組表示。對(duì)于IP地址的每個(gè)字節(jié),它會(huì)遍歷可能的值,為每個(gè)字節(jié)創(chuàng)建一個(gè)新的字節(jié)數(shù)組,并將其轉(zhuǎn)換回IP地址,添加到結(jié)果列表中。最后,將列表轉(zhuǎn)換為字符串?dāng)?shù)組并返回。
到此這篇關(guān)于Java如何獲取一個(gè)IP段內(nèi)的所有IP地址的文章就介紹到這了,更多相關(guān)Java獲取IP段內(nèi)所有IP地址內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用gRPC微服務(wù)的內(nèi)部通信優(yōu)化
這篇文章主要為大家介紹了微服務(wù)優(yōu)化之使用gRPC做微服務(wù)的內(nèi)部通信,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
SpringBoot之Java配置的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot之Java配置的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
vue+ java 實(shí)現(xiàn)多級(jí)菜單遞歸效果
這篇文章主要介紹了vue+ java 實(shí)現(xiàn)多級(jí)菜單遞歸效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
關(guān)于Java中攔截mybatis并輸出完整sql語(yǔ)句的方法
這篇文章主要介紹了關(guān)于Java中攔截mybatis并輸出完整sql語(yǔ)句的方法,假如項(xiàng)目中有很多很多的SQL我們不可能一一的去修改解決。這個(gè)時(shí)候我們就需要通過(guò)mybatis攔截SQL并且最終修改SQL,需要的朋友可以參考下2023-08-08
Java中LocalDate的詳細(xì)方法舉例總結(jié)
這篇文章主要給大家介紹了關(guān)于Java中LocalDate詳細(xì)方法舉例的相關(guān)資料,LocalDate主要是用來(lái)處理日期的類,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09
Java 快速排序(QuickSort)原理及實(shí)現(xiàn)代碼
這篇文章主要介紹了Java 快速排序(QuickSort)原理及實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2014-01-01

