3

当我尝试检查字符串是否为 IPv4 地址时,我发现该函数给出了以下结果。

144.122.1 --> 真

144.122.1.a -->假

144.122.1.333 -->假

知道为什么第一个是真的吗?

功能是:sun.net.util.IPAddressUtil.isIPv4LiteralAddress

4

2 回答 2

7

您可以从源代码本身了解他们为什么这样做:

当指定一个三部分地址时,最后一部分被解释为一个 16 位的数量并放置在网络地址的最右边的两个字节中。这使得三部分地址格式便于将 B 类网络地址指定为 128.net.host。

所以它看起来144.122.1等同于144.122.0.1

关于文本 IP 地址的部分数量的完整注释集摘录如下:

当只给出一部分时,该值直接存储在网络地址中,无需任何字节重排。

当提供两部分地址时,最后一部分被解释为 24 位数量并放置在网络地址的最右边三个字节中。这使得两部分地址格式便于将 A 类网络地址指定为 net.host。

当指定一个三部分地址时,最后一部分被解释为一个 16 位的数量并放置在网络地址的最右边的两个字节中。这使得三部分地址格式便于将 B 类网络地址指定为 128.net.host。

当指定四个部分时,每个部分都被解释为一个数据字节,并从左到右分配给 IPv4 地址的四个字节。

于 2010-11-24T14:35:01.677 回答
2

如果要检查 IP 地址的格式是否为 0-255.0-255.0-255.0-255,或者使用如下所示的正则表达式

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author ragavan
 */
public class MatchIPv4Address {
    public static void main(String[] args) {
        String range = "(([01][0-9][0-9])|(2([0-4][0-9]|5[0-5]))|([0-9]?[0-9]))";
        String pattern = range+"\\."+range+"\\."+range+"\\."+range;
        System.out.println(pattern);
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher("144.229.1.99");
        System.out.println(m.matches());
    }

}
于 2010-11-24T14:37:00.003 回答