web-dev-qa-db-fra.com

Calculez si une adresse IP est dans une plage spécifiée dans Java

Je veux pouvoir retourner vrai/faux selon qu'une IP est dans la gamme de deux autres IP.

Par exemple:

ip 192.200.3.0

range from 192.200.0.0

range to 192.255.0.0

devrait aboutir à vrai.

Autres exemples:

assert 192.200.1.0 == true
assert 192.199.1.1 == false
assert 197.200.1.0 == false
32
Shervin Asgari

La façon la plus simple de vérifier la plage est probablement de convertir les adresses IP en entiers 32 bits, puis de comparer simplement les entiers.

public class Example {
    public static long ipToLong(InetAddress ip) {
        byte[] octets = ip.getAddress();
        long result = 0;
        for (byte octet : octets) {
            result <<= 8;
            result |= octet & 0xff;
        }
        return result;
    }

    public static void main(String[] args) throws UnknownHostException {
        long ipLo = ipToLong(InetAddress.getByName("192.200.0.0"));
        long ipHi = ipToLong(InetAddress.getByName("192.255.0.0"));
        long ipToTest = ipToLong(InetAddress.getByName("192.200.3.0"));

        System.out.println(ipToTest >= ipLo && ipToTest <= ipHi);
    }
}

Plutôt que InetAddress.getByName(), vous voudrez peut-être regarder la bibliothèque Guava qui a une classe d'assistance InetAddresses qui évite la possibilité de recherches DNS.

64
hallidave