Java - Convertir l'adresse IP en nombre décimal
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
-
Puissance normale de 256
-
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