现在有这样一个场景,提供一个起始的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 stringpython 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; } /// <phpsummary> /// 将数值转换为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.pythonToString(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()); WGGAlXflC } } 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地址内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论