【问题标题】:Determine if net mask is valid in Java确定网络掩码在 Java 中是否有效
【发布时间】:2012-04-22 20:38:00
【问题描述】:

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

【问题讨论】:

  • 您是在寻找任何有效的 IP 还是要检查一组 IP?任何有效的 IP(作为字符串)将是由 . 分隔的 4 个数字,其值介于(包括)0255 之间,您可以检查这种情况。作为一个数字,ip 必须介于 0 和 2^32-1 之间。

标签: java ip-address


【解决方案1】:

如果您乐于包含外部依赖项,那么 Apache 的 commons.net 可能会满足您的需求。

查看SubnetUtils 及其SubnetInfo 嵌套类。您可以使用 IP 地址和掩码构造 SubnetUtils。如果您的掩码无效,constructor 会引发异常,SubnetInfo.html#isInRange 可以告诉您 IP 是否在掩码范围内。

【讨论】:

  • 非常好。我对外部依赖没有任何限制或反感。
  • 这个问题是几年前的问题,所以这个评论可能无效,但我尝试了一个故意使用格式错误的网络掩码的实验(至少我认为它格式错误:205.0.0.0)。我没有从构造函数中得到异常,但我能够使用 SubnetInfo 中的一些工具至少检测到问题。
【解决方案2】:

这个伪代码怎么样:

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

【讨论】:

    【解决方案3】:

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

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

    • IP 地址的组成部分可以有前导零。
    • IP 地址也可以由三个、两个甚至一个组件组成。

    请参阅Inet4Address javadoc,了解 IP 地址字符串的外观。

    【讨论】:

    • 感谢外部依赖的替代方案。我对外部依赖没问题,但我相信会有其他人通过在这里搜索找到自己的方式,他们不会或不能使用外部依赖。
    【解决方案4】:

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

    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
    }
    

    【讨论】:

    • 我不认为 255.255.255.1 是一个有效的网络掩码
    • 这似乎是任何有效 IP 地址的正则表达式。我一直在寻找符合网络掩码规则的东西。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2020-12-14
    • 1970-01-01
    • 2010-10-09
    • 2018-04-03
    • 2015-02-24
    • 2016-12-27
    • 2013-11-01
    相关资源
    最近更新 更多