java-ip-to-decimal、width = 640、height = 342

このチュートリアルでは、IPアドレスをJavaで10進数に変換する方法と、その逆の方法を示します。たとえば :

255.255.255.255  <->  4294967295
192.168.1.2      <->  3232235778

1. IPアドレスから小数点まで

IPアドレスを10進数に変換する2つの方法を示します

  1. 256の通常電力

  2. ビットシフト

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

  1. (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]