Как получить следующий IP-адрес от данного IP-адреса в Java? - PullRequest
4 голосов
/ 09 июня 2011

Народ,

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

, поэтому getNextIPV4Address("10.1.1.1") возвращает "10.1.1.2".

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

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

Ответы [ 7 ]

6 голосов
/ 09 июня 2011

Ищу фрагмент кода 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 & 0xFF, i >> 16 & 0xFF,
                                        i >>   8 & 0xFF, i >>  0 & 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
4 голосов
/ 09 июня 2011

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

3 голосов
/ 09 июня 2011

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

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

2 голосов
/ 09 июня 2011

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

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"));
}
1 голос
/ 09 июня 2011

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

0 голосов
/ 26 апреля 2018

Если использование сторонних библиотек в порядке, Гуава может использоваться для получения следующего (или любого числа после) 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);
0 голосов
/ 09 июня 2011

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

...