4

伙计们,

我正在寻找一个 Java 代码片段,它给出了给定 IP 的下一个地址。

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

可以进行字符串处理,但最终可能会变得混乱。有没有一种非常正式的方式来做到这一点。

谢谢你的时间。

4

7 回答 7

8

我正在寻找一个 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
于 2011-06-09T15:59:39.983 回答
4

IP 地址不是“连续的”,所以我怀疑你会找到一个库来为你做这件事。

于 2011-06-09T15:51:16.027 回答
3

IP 地址几乎只是一个 32 位整数。根据您存储它的方式,可以简单地增加这个基础值。这可能不是很可靠,但是因为您必须考虑子网、不同的地址类别等。

正如 dty 指出的那样,IP 地址不是连续的,所以我不认为有任何“正式”的方式来做到这一点。

于 2011-06-09T15:53:13.837 回答
3

这将使您入门(添加错误处理、极端情况等):

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"));
}
于 2011-06-09T16:02:37.333 回答
1

拆分.,将最后一个元素转换为 int 并递增它。检查它的值是否小于 254,否则你会为自己赢得一个广播地址。祈祷你总是在处理完整的 C 类子网。

于 2011-06-09T15:56:24.640 回答
0

用“.”分割字符串 并将 4 个字符串转换为字节。将所有字节相乘以获得 int 乘法。增加结果。通过除以整数并在每个字节中存储 mod 来恢复字节。将字节转换为字符串并连接所有字符串。

于 2011-06-09T15:56:17.680 回答
0

如果可以使用 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);
于 2018-04-26T10:45:15.900 回答