web-dev-qa-db-ja.com

127.0.0.1から2130706433に移動し、再び戻る

標準のJavaライブラリを使用して、IPV4アドレス("127.0.0.1")の点線の文字列表現から同等の整数表現(2130706433)に到達する最も簡単な方法は何ですか。 )。

それに対応して、整数2130706433から文字列表現"127.0.0.1"に移行して、上記の操作を反転する最も簡単な方法は何ですか?

20
knorv

Intへの文字列:

int pack(byte[] bytes) {
  int val = 0;
  for (int i = 0; i < bytes.length; i++) {
    val <<= 8;
    val |= bytes[i] & 0xff;
  }
  return val;
}

pack(InetAddress.getByName(dottedString).getAddress());

文字列への整数:

byte[] unpack(int bytes) {
  return new byte[] {
    (byte)((bytes >>> 24) & 0xff),
    (byte)((bytes >>> 16) & 0xff),
    (byte)((bytes >>>  8) & 0xff),
    (byte)((bytes       ) & 0xff)
  };
}


InetAddress.getByAddress(unpack(packedBytes)).getHostAddress()
31
Geoff Reedy

Google Guava InetAddress クラスを使用することもできます

String ip = "192.168.0.1";
InetAddress addr = InetAddresses.forString(ip);
// Convert to int
int address = InetAddresses.coerceToInteger(addr);
// Back to str 
String addressStr = InetAddresses.fromInteger(address));
28
Ido

元の回答を変更しました。 Sunの InetAddress の実装では、hashCodeメソッドはIPv4アドレスの整数表現を生成しますが、コメント提供者が正しく指摘しているように、これはJavaDocによって保証されていません。 。したがって、代わりに ByteBuffer クラスを使用してIPv4アドレスの値を計算することにしました。

import Java.net.InetAddress;
import Java.nio.ByteBuffer;

// ...

try {
    // Convert from integer to an IPv4 address
    InetAddress foo = InetAddress.getByName("2130706433");
    String address = foo.getHostAddress();
    System.out.println(address);

    // Convert from an IPv4 address to an integer
    InetAddress bar = InetAddress.getByName("127.0.0.1");
    int value = ByteBuffer.wrap(bar.getAddress()).getInt();
    System.out.println(value);

} catch (Exception e) {
    e.printStackTrace();
}

出力は次のようになります。

127.0.0.1
2130706433
10
William Brendel

長い手の数学を学ぶ必要がある場合は、Substrを使用してオクテットを取り除くことができます。クラスを表す最初のオクテットは、(256 * 256 * 256)または(2 ^ 24)2番目に(256 * 256)(2 ^ 16)3番目に(256)(2 ^ 8)4番目に1を掛けたものまたは(2 ^ 0)

127 *(2 ^ 24)+ 0 *(2 ^ 16)+ 0 *(2 ^ 8)+ 1 *(2 ^ 0)2130706432 + 0 + 0 + 1 = 2130706433

3
Abei Villafane

私はそれを試していません。パフォーマンスですが、最も簡単な方法はおそらくNIO ByteBuffer を使用することです。

例えば.

 byteBuffer.put(integer).array();

整数を表すバイト配列を返します。 mayはバイト順序を変更する必要があります。

2
Brian Agnew

IPAddress Java library これは単純で、方向ごとに1行のコードです。免責事項:私はそのライブラリのプロジェクトマネージャーです。

    IPv4Address loopback = new IPAddressString("127.0.0.1").getAddress().toIPv4();
    System.out.println(loopback.intValue());
    IPv4Address backAgain = new IPv4Address(loopback.intValue());
    System.out.println(backAgain);

出力:

    2130706433
    127.0.0.1
2
Sean F

別の方法:

public static 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;
  }
0
Sathish Kumar S