Java - Convertir une adresse IP en nombre décimal

Java - Convertir l'adresse IP en nombre décimal

java-ip-to-decimal

Dans ce didacticiel, nous vous montrons comment convertir une adresse IP en son équivalent décimal en Java, et vice versa. Pour des exemples :

255.255.255.255  <->  4294967295
192.168.1.2      <->  3232235778

1. Adresse IP en décimal

Nous vous montrons deux façons de convertir une adresse IP en un nombre décimal

  1. Puissance normale de 256

  2. Décalage de bits

1.1 First Example – Power of 256
L'adresse IP est «base 256», pour convertir192.168.1.2 en décimal (base 10) la formule est:

192 x (256)^3 + 168 x (256)^2 + 1 x (256)^1 + 2 (256)^0 = ?
3221225472 + 11010048 + 256 + 2 = 3232235778
  public long ipToLong(String ipAddress) {

    String[] ipAddressInArray = ipAddress.split("\\.");

    long result = 0;
    for (int i = 0; i < ipAddressInArray.length; i++) {

        int power = 3 - i;
        int ip = Integer.parseInt(ipAddressInArray[i]);
        result += ip * Math.pow(256, power);

    }

    return result;
  }

Certains développeurs préfèrent utiliser modulaire comme celui-ci

result += (Integer.parseInt(ipAddressInArray[i]) % 256 * Math.pow(256, power));

1.2 Second Example - Bit shifting
Consultez le graphique de décalage binaire ci-dessous:

  public long ipToLong(String ipAddress) {

    long result = 0;

    String[] ipAddressInArray = ipAddress.split("\\.");

    for (int i = 3; i >= 0; i--) {

        long ip = Long.parseLong(ipAddressInArray[3 - i]);

        //left shifting 24,16,8,0 and bitwise OR

        //1. 192 << 24
        //1. 168 << 16
        //1. 1   << 8
        //1. 2   << 0
        result |= ip << (i * 8);

    }

    return result;
  }
192         00000000 00000000 00000000 11000000
-----------------------------------------------
192 << 24   11000000 00000000 00000000 00000000
Result      00000000 00000000 00000000 00000000
Result |=   11000000 00000000 00000000 00000000

168         00000000 00000000 00000000 10101000
-----------------------------------------------
168 << 16   00000000 10101000 00000000 00000000
Result      11000000 00000000 00000000 00000000
Result |=   11000000 10101000 00000000 00000000

1           00000000 00000000 00000000 00000001
-----------------------------------------------
1   << 8    00000000 00000000 00000001 00000000
Result      11000000 10101000 00000000 00000000
Result |=   11000000 10101000 00000001 00000000

2           00000000 00000000 00000000 00000010
-----------------------------------------------
2 << 0      00000000 00000000 00000000 00000010
Result      11000000 10101000 00000001 00000000
Result |=   11000000 10101000 00000001 00000010

Convertissez le code binaire final en décimal, par calcul manuel :) ~

Result      11000000 10101000 00000001 00000010
index       0 - 31, start from right.
            31(1),30(1),29,28,27,26,25,24,23(1),22,21(1),20,19(1),18,17,16,15,14,13,12,11,10,9,8(1),7,6,5,4,3,2,1(1),0
Decimal     1x2^31 + 1x2^30 + 1x2^23 + 1x2^21 + 1x2^19 + 1x2^8 + 1x2^1
            2147483648 + 1073741824 + 8388608 + 2097152 + 524288 + 256 + 2
            3232235778

2. Décimal en adresse IP

Nous vous montrons des exemples de décalage de deux bits et de masquage "0xff" pour reconvertir un nombre décimal en adresse IP. Le changement de bits est très difficile à expliquer avec des mots, il vaut mieux revoir les flux binaires ci-dessous:

2.1 First Example.

  //ip = 3232235778
  public String longToIp(long ip) {
    StringBuilder result = new StringBuilder(15);

    for (int i = 0; i < 4; i++) {

        result.insert(0,Long.toString(ip & 0xff));

        if (i < 3) {
            sb.insert(0,'.');
        }

        ip = ip >> 8;
    }
    return result.toString();
  }

Passez en revue les flux de décalage de bits:

3232235778      11000000 10101000 00000001 00000010

<>
-----------------------------------------------------------
ip              11000000 10101000 00000001 00000010
& 0xff          00000000 00000000 00000000 11111111
Result                  00000000 00000000 00000000 00000010 = 2
Result Append           .2
                                 -------------------------> 8
ip >> 8           00000000 11000000 10101000 00000001 {off 00000010}

<>
-----------------------------------------------------------
ip              00000000 11000000 10101000 00000001
& 0xff          00000000 00000000 00000000 11111111
Result                  00000000 00000000 00000000 00000001 = 1
Result Append           1.2
                                          ----------------> 8
ip >> 8           00000000 00000000 11000000 10101000 {off 00000001}

<>
-----------------------------------------------------------
ip              00000000 00000000 11000000 10101000
& 0xff          00000000 00000000 00000000 11111111
Result                  00000000 00000000 00000000 10101000 = 168
Result Append           168.1.2
                                                   -------> 8
ip >> 8           00000000 00000000 00000000 11000000 {off 10101000}

<>
-----------------------------------------------------------
ip              00000000 00000000 00000000 11000000
& 0xff          00000000 00000000 00000000 11111111
Result                  00000000 00000000 00000000 11000000 = 192
Result Append           192.168.1.2
                                                            -----------> 8
ip >> 8           00000000 00000000 00000000 00000000 {off 11000000}

2.2 Second Example.

  //ip = 3232235778
  public String longToIp(long ip) {

    return ((ip >> 24) & 0xFF) + "."
        + ((ip >> 16) & 0xFF) + "."
        + ((ip >> 8) & 0xFF) + "."
        + (ip & 0xFF);

  }
3232235778      11000000 10101000 00000001 00000010

1. (ip >> 24) & 0xFF
-----------------------------------------------------------
ip              11000000 10101000 00000001 00000010
                                                   -------------------------------------> 24
ip >> 24                00000000 00000000 00000000 11000000 {off 10101000 00000001 00000010}
& 0xff          00000000 00000000 00000000 11111111
Result                  00000000 00000000 00000000 11000000 = 192

2. (ip >> 16) & 0xFF
-----------------------------------------------------------
ip              11000000 10101000 00000001 00000010
                                          -------------------------------------> 16
ip >> 16                00000000 00000000 11000000 10101000 {off 00000001 00000010}
& 0xff          00000000 00000000 00000000 11111111
Result                  00000000 00000000 00000000 10101000 = 168

3. (ip >> 8) & 0xFF
-----------------------------------------------------------
ip              11000000 10101000 00000001 00000010
                                 --------------------------------------> 8
ip >> 24                00000000 11000000 10101000 00000001 {off 00000010}
& 0xff          00000000 00000000 00000000 11111111
Result                  00000000 00000000 00000000 00000001 = 1

4. ip & 0xFF
-----------------------------------------------------------
ip              11000000 10101000 00000001 00000010
& 0xff          00000000 00000000 00000000 11111111
Result                  00000000 00000000 00000000 00000010 = 2

3. Code source Java

Exemple Java complet pour illustrer le scénario ci-dessus:

package com.example.core;

public class JavaBitwiseExample {

    public static void main(String[] args) {

        JavaBitwiseExample obj = new JavaBitwiseExample();

        System.out.println("iptoLong  : " + obj.ipToLong("192.168.1.2"));
        System.out.println("iptoLong2 : " + obj.ipToLong2("192.168.1.2"));

        System.out.println("longToIp  : " + obj.longToIp(3232235778L));
        System.out.println("longToIp2 : " + obj.longToIp2(3232235778L));

    }

    // example : 192.168.1.2
    public long ipToLong(String ipAddress) {

        // ipAddressInArray[0] = 192
        String[] ipAddressInArray = ipAddress.split("\\.");

        long result = 0;
        for (int i = 0; i < ipAddressInArray.length; i++) {

            int power = 3 - i;
            int ip = Integer.parseInt(ipAddressInArray[i]);

            // 1. 192 * 256^3
            // 2. 168 * 256^2
            // 3. 1 * 256^1
            // 4. 2 * 256^0
            result += ip * Math.pow(256, power);

        }

        return result;

    }

    public long ipToLong2(String ipAddress) {

        long result = 0;

        String[] ipAddressInArray = ipAddress.split("\\.");

        for (int i = 3; i >= 0; i--) {

            long ip = Long.parseLong(ipAddressInArray[3 - i]);

            // left shifting 24,16,8,0 and bitwise OR

            // 1. 192 << 24
            // 1. 168 << 16
            // 1. 1 << 8
            // 1. 2 << 0
            result |= ip << (i * 8);

        }

        return result;
    }

    public String longToIp(long i) {

        return ((i >> 24) & 0xFF) +
                   "." + ((i >> 16) & 0xFF) +
                   "." + ((i >> 8) & 0xFF) +
                   "." + (i & 0xFF);

    }

    public String longToIp2(long ip) {
        StringBuilder sb = new StringBuilder(15);

        for (int i = 0; i < 4; i++) {

            // 1. 2
            // 2. 1
            // 3. 168
            // 4. 192
            sb.insert(0, Long.toString(ip & 0xff));

            if (i < 3) {
                sb.insert(0, '.');
            }

            // 1. 192.168.1.2
            // 2. 192.168.1
            // 3. 192.168
            // 4. 192
            ip = ip >> 8;

        }

        return sb.toString();
    }

    /*
    private static void printPrettyBinary(String binary) {

        String s1 = String.format("%32s", binary).replace(' ', '0');

        System.out.format("%8s %8s %8s %8s %n",
            s1.substring(0, 8),
            s1.substring(8, 16),
            s1.substring(16, 24),
            s1.substring(24, 32));
    }
    */
}

Sortie

iptoLong  : 3232235778
iptoLong2 : 3232235778
longToIp  : 192.168.1.2
longToIp2 : 192.168.1.2