Java – IPアドレスを10進数に変換する
このチュートリアルでは、IPアドレスをJavaで10進数に変換する方法と、その逆の方法を示します。たとえば :
255.255.255.255 <-> 4294967295 192.168.1.2 <-> 3232235778
1. IPアドレスから小数点まで
IPアドレスを10進数に変換する2つの方法を示します
-
256の通常電力
-
ビットシフト
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; }
いくつかの開発者は、このようにモジュール式を使用することを好む
result += (Integer.parseInt(ipAddressInArray[i]) % 256 ** Math.pow(256, power));
-
1.2第2の例 – ビットシフト** 下記のバイナリビットシフトグラフを見直してください。
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結果00000000 00000000 00000000 00000000結果| = 11000000 00000000 00000000 00000000 168 00000000 00000000 00000000 10101000 ----------------------------------------------- 168 << 16 00000000 10101000 00000000 00000000 結果11000000 00000000 00000000 00000000 結果| = 11000000 10101000 00000000 00000000 1 00000000 00000000 00000000 00000001 ----------------------------------------------- 1 << 8 00000000 00000000 00000001 00000000結果11000000 10101000 00000000 00000000結果| = 11000000 10101000 00000001 00000000 2 00000000 00000000 00000000 00000010 ----------------------------------------------- 2 << 00000000 00000000 00000000 00000010 結果11000000 10101000 00000001 00000000 結果| = 11000000 10101000 00000001 00000010
手作業で最終バイナリコードを10進数に変換する:)〜
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進数からIPアドレスへ
10進数をIPアドレスに変換するための2ビットシフトと “0xff”マスキングの例を示します。ビットシフトは言葉で説明するのが非常に難しいです、以下のバイナリの流れをよく見直してください:
-
2.1最初の例。**
//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(); }
ビットシフトフローを確認する:
3232235778 11000000 10101000 00000001 00000010 <<Loop 1>> ----------------------------------------------------------- ip 11000000 10101000 00000001 00000010&0xff 00000000 00000000 00000000 11111111結果00000000 00000000 00000000 00000010 = 2結果の追加.2 -------------------------> 8 ip >> 8 00000000 11000000 10101000 00000001 {オフ00000010} <<ループ2 >> -------------------------------------------------- --------- ip 00000000 11000000 10101000 00000001 ip 00000000 00000000 11000000 10101000 <<ループ4 >> -------------------------------------------------- --------- ip 00000000 00000000 00000000 11000000 ** 2.2 2番目の例**
//ip = 3232235778 public String longToIp(long ip) {
return ((ip >> 24) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + (ip & 0xFF);
}
3232235778 11000000 10101000 00000001 00000010
-
(ip >> 24) & 0xFF
ip 11000000 10101000 00000001 00000010 -------------------------------------> 24 ip >> 24 00000000 00000000 00000000 11000000 {オフ10101000 00000001 00000010} 2.(ip >> 16) ip 11000000 10101000 00000001 00000010 --------------------------------------> 8 ip >> 24 00000000 11000000 10101000 00000001 {オフ00000010} 4. ip === 3. Javaソースコード 上記のシナリオを示す完全なJavaの例: .... package com.mkyong.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)); } ** /} .... 出力 .... iptoLong : 3232235778 iptoLong2 : 3232235778 longToIp : 192.168.1.2 longToIp2 : 192.168.1.2 .... === 参考文献 . リンク://java/java-and-0xff-example/[Javaと0xffの例] . http://processing.org/reference/bitwiseOR.htmlビット単位の例 . http://help.network-tools.com/convert-base-10-to-ip/[Convert base 10 to ip]。 http://technet.microsoft.com/en-us/library/bb726995.aspx[Microsoft: IPアドレッシング]。 http://ja.wikipedia.org/wiki/Power__of__two[ウィキペディア:2の威力] . http://en.wikipedia.org/wiki/Bitwise__operation[Wikipedia:Bitwise 操作]。 http://stackoverflow.com/questions/12130464/ip-address-conversion-to-decimal-and-vice-versa[Stackoverflow : ip address conversion to decimal and vice versa]. http://stackoverflow.com/questions/141525/absolute-beginners-guide-to-bit-shifting[Stackoverflow : Absolute Beginner's Guide to Bit Shifting?] link://タグ/ビットシフト/[ビットシフト]link://tag/bitwise/[bitwise]link://tag/ip-address/[ip address]link://タグ/java/[java]