Как я могу получить отдельные последовательные блоки IP из диапазона IP? - PullRequest
0 голосов
/ 18 января 2020

Учитывая диапазон 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/ от { ссылка } Я попробовал следующее, но не могу найти способ сделать это в документации.

 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, поэтому я собираюсь решить все проблемы.

1 Ответ

1 голос
/ 18 января 2020

Вот мой начальный удар. Вы должны понимать, что диапазоны, о которых вы говорите, довольно велики. Я использую longs, чтобы избежать целочисленных проблем со знаком в моем диапазоне LongStream.

    public static void main(String[] args) {
        printIPs("192.148.233.0", "192.148.245.3", 32);

    }

    public static void printIPs(String start, String end, int mask) {
        LongStream.rangeClosed(toLong(start, mask), toLong(end, mask))
                .mapToObj(ip-> toIP(ip, mask))
                .forEach(System.out::println);

    }

    public static String toIP(long lv, int mask) {
        lv <<= (32-mask);
        String ip = String.join(".",
                Long.toString((lv >> 24) & 0xFF),
                Long.toString((lv >> 16) & 0xFF),
                Long.toString((lv >> 8) & 0xFF),
                Long.toString(lv & 0xFF));
        return ip;
    }

    public static long toLong(String ip, int mask) {
        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 >> (32-mask);
    }
}
}
...