给出一个IP范围,例如41.216.124.0-41.216.127.27,我想得到以下内容:
41.216.124。*
41.216.125。*
41.216.126。*
41.216.127。*
类似给定的128.1.0.1-191.255.255.254我想单独列出它们128.1.0.1-255
128.1.1-255。*
128.2-255。*
。*
129-190。*
。*
191.0-254。*
。*
191.255。*
191.255.255。*
我已经尝试了多种方法,包括使用正则表达式匹配不重复的字段,并尝试找出差异。我通过https://seancfoley.github.io/IPAddress/遇到了一个很好的库https://stackoverflow.com/users/6801443/sean-f,我尝试了以下方法,但似乎无法在文档中找到实现此目的的方法。
var ipRange1 = "128.1.0.1-191.255.255.254"; //ipRange1 example
var ipRange2 = "41.216.124.0-41.216.127.27"; //ipRange2 example
import inet.ipaddr.IPAddress;
import inet.ipaddr.IPAddressSeqRange;
import inet.ipaddr.IPAddressString;
String[] subString = ipRange2.split("-");
IPAddressString startIP = new IPAddressString(subString[0]);
IPAddressString endIP = new IPAddressString(subString[1]);
IPAddress one = startIP.getAddress(), two = endIP.getAddress();
IPAddressSeqRange range = one.toSequentialRange(two);
var ips = new HashSet<String>();
IPAddress blocks[] = range.spanWithSequentialBlocks(); // 41.216.124-126.```*```
即使没有此库,是否仍可以用Java来完成?我正在尝试查询的API使用IP前缀,这就是为什么我会遇到麻烦。
这是我最初的刺路。您必须意识到所讨论的范围很大。我正在使用long来避免在LongStream
范围内的有符号整数问题。
public void printIPs(String start, String end) {
LongStream
.rangeClosed(toLong(start), toLong(end))
.mapToObj(this::toIP).forEach(System.out::println);
}
// convert low order bytes of long value to IP address string.
public String toIP(long lv) {
int v = (int) lv;
String ip = String.join(".",
Integer.toString((v >> 24) & 0xFF),
Integer.toString((v >> 16) & 0xFF),
Integer.toString((v >> 8) & 0xFF),
Integer.toString(v & 0xFF));
return ip;
}
// Convert String IP to a long
public static long toLong(String ip) {
String[] n = ip.split("\\.");
long v = Integer.valueOf(n[0]);
v <<= 8;
v |= Integer.valueOf(n[1]);
v <<= 8;
v |= Integer.valueOf(n[2]);
v <<= 8;
v |= Integer.valueOf(n[3]);
return v;
}