как получить следующий ip-адрес с заданного ip в Java?

#java #ip-address #ipv4 #inetaddress

#java #ip-адрес #ipv4 #inetaddress

Вопрос:

Ребята,

Я ищу фрагмент кода Java, который выдает следующий адрес с заданного IP.

итак, getNextIPV4Address("10.1.1.1") возвращает "10.1.1.2" .

Сжатие строки может быть выполнено, но может привести к беспорядку. Существует ли формализованный способ для этого.

Спасибо за ваше время.

Ответ №1:

Я ищу фрагмент кода Java, который выдает следующий адрес с заданного IP.

Вот фрагмент для вас:

 public static String getNextIPV4Address(String ip) {
    String[] nums = ip.split("\.");
    int i = (Integer.parseInt(nums[0]) << 24 | Integer.parseInt(nums[2]) << 8
          |  Integer.parseInt(nums[1]) << 16 | Integer.parseInt(nums[3]))   1;

    // If you wish to skip over .255 addresses.
    if ((byte) i == -1) i  ;

    return String.format("%d.%d.%d.%d", i >>> 24 amp; 0xFF, i >> 16 amp; 0xFF,
                                        i >>   8 amp; 0xFF, i >>  0 amp; 0xFF);
}
  

Примеры ввода / вывода (ideone.com демонстрация):

 10.1.1.0        -> 10.1.1.1
10.255.255.255  -> 11.0.0.0
10.0.255.254    -> 10.1.0.0
  

Комментарии:

1. Разве эта функция не вернет адрес подсети для .254 адресов? 192.168.0.254 -> 192.168.1.0? arr[index] = "0" должно быть arr[index] = index == 3 ? arr[index] = "1" : arr[index] = "0"; , нет?

2. Зависит от того, как вы определяете «следующий» ip-адрес 🙂

3. Это правда. Возможно, я слишком много предполагал, думая, что ему понадобятся пригодные для использования ip-адреса 🙂

4. @Пока, хехех, да. Это было бы слишком большим предположением 😉 …jk. обновил ответ.

Ответ №2:

Это поможет вам начать (добавить обработку ошибок, угловые случаи и т.д.):

 public static final String nextIpAddress(final String input) {
    final String[] tokens = input.split("\.");
    if (tokens.length != 4)
        throw new IllegalArgumentException();
    for (int i = tokens.length - 1; i >= 0; i--) {
        final int item = Integer.parseInt(tokens[i]);
        if (item < 255) {
            tokens[i] = String.valueOf(item   1);
            for (int j = i   1; j < 4; j  ) {
                tokens[j] = "0";
            }
            break;
        }
    }
    return new StringBuilder()
    .append(tokens[0]).append('.')
    .append(tokens[1]).append('.')
    .append(tokens[2]).append('.')
    .append(tokens[3])
    .toString();
}
  

Тестовый пример:

 @Test
public void testNextIpAddress() {
    assertEquals("1.2.3.5", nextIpAddress("1.2.3.4"));
    assertEquals("1.2.4.0", nextIpAddress("1.2.3.255"));
}
  

Ответ №3:

IP-адреса не являются «последовательными», поэтому я сомневаюсь, что вы найдете библиотеку, которая сделает это за вас.

Ответ №4:

IP-адрес — это в значительной степени просто 32-разрядное целое число. В зависимости от того, как вы его сохраняете, может быть возможно просто увеличить это базовое значение. Однако это, вероятно, будет не очень надежным, поскольку вам придется учитывать подсети, разные классы адресов и т.д.

Как указывает dty, IP-адреса не являются последовательными, поэтому я бы не стал представлять, что существует какой-либо «формальный» способ сделать это.

Ответ №5:

Разделите на . , приведите последний элемент к int и увеличьте его. Проверьте, меньше ли его значение 254, или вы сами получите широковещательный адрес. Молитесь, чтобы вы всегда имели дело с полными подсетями класса C.

Ответ №6:

Разделите строку на «.» и преобразуйте 4 строки в байты. Умножьте все байты, чтобы получить умножение int. Увеличьте результат. Восстановите байты, разделив целое число и сохранив mod в каждом байте. Преобразуйте байты в строки и объедините все строки.

Ответ №7:

Если использование сторонних библиотек в порядке, Guava можно использовать для получения следующего (или любого числа после) IP-адреса, подобного этому:

 InetAddress a = InetAddresses.forString("192.168.1.1");
int i = InetAddresses.coerceToInteger(a);
InetAddress b = InetAddresses.fromInteger(i 1);
String s = InetAddresses.toAddrString(b);
System.out.println(s);