我如何从IP范围中获取单个顺序的IP块?

问题描述 投票:0回答:1

给出一个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前缀,这就是为什么我会遇到麻烦。

java ip-address
1个回答
1
投票

这是我最初的刺路。您必须意识到所讨论的范围很大。我正在使用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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.