繁体   English   中英

有效IP字符串中的“:”是否足以确定其为IPv6地址?

[英]Is “:” in a valid IP string sufficient to determine it is an IPv6 address?

给出的字符串无疑是100%的有效 IP地址。

但是,将其作为参数接收的方法不会接收告诉它是IPv4还是IPv6的附加参数。

我已经看到一种确定是IPv4还是IPv6的方法:

InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It's ipv6
} else if (address instanceof Inet4Address) {
    // It's ipv4
}

但是我正在寻找一种更快的方法(请注意,上面也应该包含try / catch)。

我可以摆脱一些简单的事情吗:

if (totallyValidIp.contains(":") {
        // It's ipv6
}
else {
        // It's ipv4
}

还是有一个我不知道的地方? (例如,不包含任何“:”的有效IPv6)。

注意:这种“优化”指望我知道IP字符串是已经检查和验证的 IP地址这一事实。

IPv6地址字符串将包含两个七个冒号,不一定是连续的。 但是,如果您已经在其他地方验证了地址,那么检查冒号的存在就足够了。

但是,如果您已经有一个InetAddress对象,则只需坚持instanceof 来回转换为字符串听起来像很多不必要的工作。

有一个陷阱,如果使用InetAddress ,仅检查是否还不够:

模式::ffff:<IPv4 Address>被视为IPv4地址。 例如,以下调用返回一个Inet4Address

InetAddress.getByName("::ffff:1.2.3.4")

对于相同地址的所有变体也是如此,例如::0:ffff:1.2.3.4

Inet6Address文档中

IPv4映射的地址
该形式的::: ffff:wxyz用来表示一个IPv4地址。 与IPv4和IPv6节点通信时,它允许本机程序使用相同的地址数据结构和相同的套接字。

在InetAddress和Inet6Address中,它用于内部表示。 它没有功能性作用。 Java绝不会返回IPv4映射的地址。 这些类可以采用字节数组和文本表示形式的IPv4映射地址作为输入。 但是,它将被转换为IPv4地址。

不过,这似乎是唯一的例外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM