簡體   English   中英

如何從 java 中的給定 ip 中獲取下一個 ip 地址?

[英]how to get the next ip address from a given ip in java?

伙計們,

我正在尋找 Java 代碼片段,它給出了給定 IP 的下一個地址。

所以getNextIPV4Address("10.1.1.1")返回"10.1.1.2"

可以進行字符串處理,但最終可能會變得混亂。 有沒有一種非常正式的方式來做到這一點。

謝謝你的時間。

我正在尋找 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);
}

示例輸入/output(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

IP 地址不是“連續的”,所以我懷疑你會找到一個庫來為你做這件事。

IP 地址幾乎只是一個 32 位 integer。 根據您存儲它的方式,可以簡單地增加這個基礎值。 這可能不是很可靠,但是因為您必須考慮子網、不同的地址類別等。

正如 dty 指出的那樣,IP 地址不是連續的,所以我不認為有任何“正式”的方式可以做到這一點。

這將使您入門(添加錯誤處理、極端情況等):

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"));
}

拆分為. ,將最后一個元素轉換為 int 並遞增它。 檢查它的值是否小於 254,否則你會為自己贏得一個廣播地址。 祈禱您始終處理完整的 class C 子網。

如果使用 3rd 方庫沒問題, 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);

用“.”分割字符串並將 4 個字符串轉換為字節。 將所有字節相乘以獲得 int 乘法。 增加結果。 通過划分 integer 並在每個字節中存儲 mod 來恢復字節。 將字節轉換為字符串並連接所有字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM