确定网络掩码在Java中是否有效

在Java 6中确定给定地址是否是有效网络掩码的最简单方法是什么? 我找到了一个解决方案,基本上创建了一个有效的IP数组用于比较(即“255.255.255.255”,“255.255.255.254”,“255.255.255.252”等…)。 有更简单的方法还是这是最好的方式?

如果您乐意包含外部依赖项,那么Apache的commons.net可能会包含您正在寻找的内容。

看看SubnetUtils及其SubnetInfo嵌套类。 您可以使用IP地址和掩码构造SubnetUtils 。 如果掩码无效, 构造函数将抛出exception,并且SubnetInfo.html#isInRange可以告诉您IP是否在掩码的范围内。

这个伪代码怎么样:

 function IS_VALID(MASK) boolean zeroStart = false for each byte in MASK for each bit if bit = 1 and zeroStart = false continue if bit = 1 and zeroStart = true return INVALID_MASK if bit = 0 and zeroStart = false zeroStart = true if bit = 0 and zeroStart = true continue return VALID_MASK 

我认为Serg10的答案是最简单的。

如果您需要避免外部依赖,那么您应该使用Inet4Address将IP地址String转换为字节数组,然后分析字节。 尝试使用正则表达式分析字符串或通过与固定字符串集进行比较,可能会给出错误的答案:

  • IP地址的组件可以具有前导零。
  • IP地址也可以用三个,两个甚至一个组件写入。

有关IP地址字符串的外观的说明,请参阅Inet4Address javadoc 。

您可以尝试使用正则表达式

 Pattern p = Pattern.compile("^((2[0-5][0-5]|1[\\d][\\d]|[\\d][\\d]|[\\d])\\.){3}(2[0-5][0-5]|1[\\d][\\d]|[\\d][\\d]|[\\d])$"); String ip = "255.255.255.0.2"; Matcher m = p.matcher(ip); if(m.matches()) { //valid }