【问题标题】:Is an IP address with an octet given by 4 or more zeros a valid IP address?带有 4 个或更多零的八位字节的 IP 地址是有效的 IP 地址吗?
【发布时间】:2014-10-01 05:11:28
【问题描述】:

top voted answer 在此处验证 IP 地址(这是一个正则表达式,因此自动不利)如果你给它一个在单个八位字节中包含 4 个或更多零的 IP 地址,则返回 false。

请注意,它以 3 或更少通过,在我看来,这会自动指示由于任意不一致而导致的代码异味(毕竟它不是以 8 为底的,因此以 10 为底的 3 并没有什么特别之处)。然而,令人惊讶的是 apache commons 实用程序 InetAddressValidator 也有这种行为(至少它只使用正则表达式进行拆分!)。

观察(使用 Scala REPL):

scala> new InetAddressValidator().isValidInet4Address("000.0.0.0")
res0: Boolean = true

scala> new InetAddressValidator().isValidInet4Address("0000.0.0.0")
res1: Boolean = false

现在 this answer 将返回 true,因为它在循环中使用 parseInt,不会任意区分零的数量。

那么它有效吗?如果它有效,则表明 Apache Commons 库和所述正则表达式中存在错误,如果它无效,则 请提供证明它的链接

【问题讨论】:

    标签: java regex ip ipv4


    【解决方案1】:

    是的,它是有效的。

    来自Wikipedia article on Dot-decimal notation的关于IPv4地址的除外:

    Internet 协议版本 4 (IPv4) 地址由 32 位组成, 它可以分为四个八位字节,每个八位字节。这四个八位 用十进制数写成,范围从 0 到 255,并且是 连接为一个字符串,中间有句号分隔符 号码。

    有效的十进制数可能以或不以前导 0 开头,并且对前导 0 的数量不应有内在限制。 wiki 页面确实阐明了前导 0 是有效的,但没有明确提及对前导零数量的任何限制。

    【讨论】:

    • 有趣...如果我给“ping”一个前导零的八位字节(在 Linux 或 Windows 上)或将它输入到浏览器中,它会将该八位字节视为八进制数!因此,如果我告诉我的浏览器转到 176.040.0142.166,它会转到 176.32.98.166 (amazon.com)。因此,如果您和 Wikipedia 对标准的看法是正确的,那么许多其他工具都在以非标准方式运行。我看到维基百科的文章提到......
    • 是的,这很混乱! - 令人沮丧的是,它是一个如此基础的概念! @ajb
    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 2015-11-02
    • 2020-10-17
    • 2016-12-01
    • 2011-04-09
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多