如何从java中给定ip获得下一个ip地址?

问题描述:

Folk,如何从java中给定ip获得下一个ip地址?

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

so getNextIPV4Address("10.1.1.1")返回"10.1.1.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")); 
} 
+0

谢谢肖恩,帮助.. – Rajan 2011-06-10 14:30:30

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

IP地址几乎只是一个32位整数。根据你如何存储它,可能只是增加这个基础值。这可能不会很可靠,但是你必须考虑子网,不同的地址类别等。

正如dty指出的那样,IP地址不是顺序的,所以我不会想象有任何一种'正式'这样做的方式。

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

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

我正在寻找一个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 demonstration):

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

不会是功能.254地址返回子网地址? 192.168.0.254 - > 192.168.1.0? 'arr [index] =“0”'应该是'arr [index] = index == 3? arr [index] =“1”:arr [index] =“0”;',不是? – Till 2011-06-09 16:05:32

+0

取决于你如何定义“下一个”ip地址:-) – aioobe 2011-06-09 16:12:20

+0

这是真的。也许我假设太多,认为他需要可用的IP地址:) – Till 2011-06-09 16:19:10