Java et “

Exemple Java et «& 0xFF»

lshiftLeft

Avant de comprendre ce qu'est& 0xFF, assurez-vous de connaître les éléments suivants:

  1. Opérateur AND au niveau du bit,link.

  2. Convertit hex en / de binaire et décimal en / de binaire.

En bref,& 0xFF est utilisé pour s'assurer que vous obtenez toujours les 8 derniers bits. Voyons un exemple pour convertir une adresse IP en / à partir d'un nombre décimal.

1. Convertir l'adresse IP en décimal

Il est courant de convertir IpAddress en décimal et de le stocker dans la base de données pour de meilleurs calculs et comparaisons.

Testing IP address = 192.168.1.2
Decimal Number     = 3232235778

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

P.S A standard IP is “base 256”, source.

2. Convertir décimal en adresse IP, avec & 0xFF

Pour reconvertir la décimale en adresse IP, nous utilisons l'opérateur de décalage de bits et le «masquons» avec& 0xff.

Code Java

  long ipAddress = 3232235778L;
  String binary = Long.toBinaryString(ipAddress);
  System.out.println(binary);
  System.out.println((ipAddress>>24) & 0xFF);
  System.out.println((ipAddress>>16) & 0xFF);
  System.out.println((ipAddress>>8) & 0xFF);
  System.out.println((ipAddress) & 0xFF);

Sortie

11000000101010000000000100000010
192
168
1
2

La question est pourquoi(ipAddress>>24) & 0xFF retournera 192? Plongez dans la théorie du décalage binaire binaire ci-dessous:

2.1 (ipAddress>>24) & 0xFF = 192

Decimal   = 3232235778
Binary    = 11000000 10101000 00000001 00000010
IpAddress = 192      168      1        2

(ipAddress>>24)
            -------------------------->24
Binary    = 00000000 00000000 00000000 11000000

(ipAddress>>24) & 0xFF
Binary    = 00000000 00000000 00000000 11000000
& 0xFF    = 00000000 00000000 00000000 11111111
Result    = 00000000 00000000 00000000 11000000 = 192 (2^7 + 2^6)

Dans ce cas, le 0xFF est facultatif.

2.2 (ipAddress>>16) & 0xFF = 168

Decimal = 3232235778
Binary  = 11000000 10101000 00000001 00000010

(ipAddress>>16)
          ----------------->16
Binary  = 00000000 00000000 11000000 10101000

(ipAddress>>16) & 0xFF
Binary  = 00000000 00000000 11000000 10101000 = 49320 (2^14 + 2^15 + 2^7 + 2^5 + 2^3)
& 0xFF  = 00000000 00000000 00000000 11111111
Result  = 00000000 00000000 00000000 10101000 = 168

Avant& 0xFF, vous obtenez 49320, après& 0xFF, vous obtenez les 168 corrects. Maintenant, vous devez comprendre l'utilisation de& 0xFF, cela garantit simplement que vous obtenez toujours les 8 derniers bits.

2.3 (ipAddress>>8) & 0xFF = 1

Decimal = 3232235778
Binary  = 11000000 10101000 00000001 00000010

(ipAddress>>8)
          -------->8
Binary  = 00000000 11000000 10101000 00000001

(ipAddress>>8) & 0xFF
Binary  = 00000000 11000000 10101000 00000001 = 12625921
& 0xFF  = 00000000 00000000 00000000 11111111
Result  = 00000000 00000000 00000000 00000001 = 1

2.4 (ipAddress) & 0xFF = 2

Decimal = 3232235778
Binary  = 11000000 10101000 00000001 00000010

(ipAddress)
Binary  = 11000000 10101000 00000001 00000010

(ipAddress) & 0xFF
Binary  = 11000000 10101000 00000001 00000010 = 3232235778
& 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.

BitwiseExample.java

package com.example.core;

public class BitwiseExample {

  public static void main(String[] args) {

    BitwiseExample obj = new BitwiseExample();
    long ipAddressInLong = obj.ipToLong("192.168.1.2");
    System.out.println(ipAddressInLong);

    String binary = Long.toBinaryString(ipAddressInLong);
    printPrettyBinary(binary);

    String ipAddressInString = obj.longToIp(ipAddressInLong);
    System.out.println(ipAddressInString);

  }

  public long ipToLong(String ipAddress) {

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

    long num = 0;
    for (int i = 0; i < addrArray.length; i++) {

        int power = 3 - i;

        // 1. (192 % 256) * 256 pow 3
        // 2. (168 % 256) * 256 pow 2
        // 3. (2 % 256) * 256 pow 1
        // 4. (1 % 256) * 256 pow 0
        num += ((Integer.parseInt(addrArray[i]) % 256 * Math.pow(256, power)));

    }

    return num;
  }

  public String longToIp(long i) {

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

  }

  //print pretty binary code, padding left zero
  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

3232235778
11000000 10101000 00000001 00000010
192.168.1.2