Движение от 127.0.0.1 до 2130706433, и назад снова

Пользование стандартными библиотеками Java, что самый быстрый путь состоит в том, чтобы получить от точечного строкового представления адресного IPV4 ("127.0.0.1") к эквивалентному целочисленному представлению (2130706433).

И соответственно, то, что состоит в том, чтобы инвертировать самый быстрый путь, сказало что операция - идущий от целого числа 2130706433 к строковому представлению"127.0.0.1"?

20
задан knorv 10 February 2010 в 23:50
поделиться

3 ответа

Строка в 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());

Int в строку:

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
ответ дан 29 November 2019 в 22:36
поделиться

Я изменил свой первоначальный ответ. В реализации InetAddress от Sun метод 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
ответ дан 29 November 2019 в 22:36
поделиться

Не пробовал. производительность, но самый простой способ - это использовать NIO ByteBuffer .

например.

 byteBuffer.put(integer).array();

вернет вам массив байтов, представляющий целое число. Вам может потребоваться изменить порядок байтов.

2
ответ дан 29 November 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: