Java “是”吗&引用;是否在有效的IP字符串中,足以确定它是IPv6地址?
给定一个100%明确表示有效的IP地址的字符串 但是,将其作为参数接收的方法不会接收另一个参数,告诉它它是IPv4还是IPv6 我发现了一种确定IPv4还是IPv6的方法:Java “是”吗&引用;是否在有效的IP字符串中,足以确定它是IPv6地址?,java,ipv6,Java,Ipv6,给定一个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
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地址。有一个陷阱,如果使用
InetAddress
,仅检查:
是不够的
模式为::ffff:
的地址被视为IPv4地址。例如,以下调用返回一个Inet4Address
:
InetAddress.getByName("::ffff:1.2.3.4")
相同地址的所有变体也是如此,如::0:ffff:1.2.3.4
从:
IPv4映射地址此IPv6地址的形式为::ffff:w.x.y.z,用于表示IPv4地址。它允许本机程序在与IPv4和IPv6节点通信时使用相同的地址数据结构和相同的套接字 在InetAddress和Inet6Address中,用于内部表示;它没有功能性作用。Java永远不会返回IPv4映射地址。这些类可以以字节数组和文本表示形式将IPv4映射地址作为输入。但是,它将被转换为IPv4地址
但这似乎是唯一的例外。有一个问题,如果使用
InetAddress
,仅检查:
是不够的
模式为::ffff:
的地址被视为IPv4地址。例如,以下调用返回一个Inet4Address
:
InetAddress.getByName("::ffff:1.2.3.4")
相同地址的所有变体也是如此,如::0:ffff:1.2.3.4
从:
IPv4映射地址此IPv6地址的形式为::ffff:w.x.y.z,用于表示IPv4地址。它允许本机程序在与IPv4和IPv6节点通信时使用相同的地址数据结构和相同的套接字 在InetAddress和Inet6Address中,用于内部表示;它没有功能性作用。Java永远不会返回IPv4映射地址。这些类可以以字节数组和文本表示形式将IPv4映射地址作为输入。但是,它将被转换为IPv4地址
但这似乎是唯一的例外。IPv6地址字符串将包含两到七个冒号,不一定是连续的。但是,如果您已经在其他地方验证了地址,那么检查是否存在冒号就足够了
但是如果您已经有了
InetAddress
对象,只需使用instanceof
。来回转换为字符串听起来像是一项不必要的工作。一个IPv6地址字符串将包含两到七个冒号,不一定是连续的。但是,如果您已经在其他地方验证了地址,那么检查是否存在冒号就足够了
但是如果您已经有了
InetAddress
对象,只需使用instanceof
。来回转换为字符串听起来像是一项不必要的工作。如果地址包含端口怎么办?i、 e.127.0.0.1:1337
Yea。一个问题是ip
实际上可能是一个DNS名称;看见但是如果是,那么它就不能包含:
字符,因此启发式失败。第一种方法并不麻烦。它简短、清晰且易于阅读。@JacobG-IP地址不能包含端口。如果是,则它不是有效的IP地址。(或主机名)@datv为什么速度快?在我看来,您在不需要优化的地方进行了过度优化。如果地址包含端口怎么办?i、 e.127.0.0.1:1337
Yea。一个问题是ip
实际上可能是一个DNS名称;看见但是如果是,那么它就不能包含:
字符,因此启发式失败。第一种方法并不麻烦。它简短、清晰且易于阅读。@JacobG-IP地址不能包含端口。如果是,则它不是有效的IP地址。(或主机名)@datv为什么速度快?在我看来,你在不需要优化的地方进行了过度优化。谢谢你指出了问题所在并给出了明确的解释。幸运的是,在我的例子中,一个经过验证的字符串(即不是InetAddress)作为参数传递。向上投票。谢谢你指出了问题的症结和清楚的解释。幸运的是,在我的例子中,一个经过验证的字符串(即不是InetAddress)作为参数传递。向上投票。我还没有InetAddress
(尽管我总是可以创建一个)。幸运的是,在我的例子中,一个经过验证的字符串(即notInetAddress
)作为参数传递。我已经确认提议的“快捷解决方案”有效。接受。我还没有InetAddress
(尽管我总是可以创建一个)。幸运的是,在我的例子中,一个经过验证的字符串(即notInetAddress
)作为参数传递。我已经确认提议的“快捷解决方案”有效。接受。