正在检查IPv4地址是否有效



我正在尝试用Java编写一个检查IP地址是否有效的基本程序。除了Scanner类之外,我尝试不使用任何外部类,也不使用任何正则表达式。

我的代码,在这个注册表中可用,接受4个整数作为输入,每个八位字节一个。我还有这个代码,它比第一个代码可读性稍高,但更长。

我的问题是,有没有其他方法可以在更少的行中实现这个想法?如果有,我将如何实现这一点?

虽然这个代码段有点冗长,但它很简单,自我描述,而且已经证明是紧凑的。

private static boolean isIPAddressValid(String ip) {    
    boolean result = true;
    int i = 0;
    int [] val = new int[4];
    if ((ip == null) || (ip.trim().length() == 0))
    {
        //null ip address entered
        result = false;
    }
    else
    {
        if (!(ip.contains(".")))
        {
            //no '.' found
            result = false;
        }
        else
        {
            String [] parts = ip.split("\.");
            if (!(parts.length == 4))
            {
                //not 4 quadrants
                result = false;
            }
            else
            {
                for (String s : parts) { 
                    try {
                        val[i] = Integer.parseInt(s);
                        if ((val[i] < 0) || (val[i] > 255))
                        {
                            //this quadrant's value exceeds limits
                            result = false;
                        }
                        i++;
                    } catch (Exception e) {
                        //failed to parse quadrant to an integer");
                        result = false;
                    }
                }
            }
        }
    }
    return result;
}

只有一些小的增强(我认为您的代码看起来非常好-到目前为止我的看法),阅读起来很清楚,所有的工作块都可以正确理解。。。。

boolean isFailed = false;
if (first < 0 || first > 255) {
    System.out.println("Octet 1 is invalid");
    isFailed = true;
}
if (second < 0 || second > 255) {
    System.out.println("Octet 2 is invalid");
    isFailed = true;
}
if (third < 0 || third > 255) {
    System.out.println("Octet 3 is invalid");
    isFailed = true;
}
if (fourth < 0 || fourth > 255) {
    System.out.println("Octet 4 is invalid");
    isFailed = true;
}
if (!isFailed){
    System.out.println("IP Address: " + first + "." + second + "." + third + "." + fourth);
}

所以我只是简单地反转打印顺序-这只为您节省了之前的检查。。。

您的方法是可以检查每个八位字节。。。

你可以简单地做4次,或者写一个方法:

private static boolean check(int octet, int index){
    if (0xFF & octet < 256) return true;
    System.out.println("Octet "+index+" is invalid";
    return false;
}

并在您的主要方法中使用此方法

if (check(first,0) && check (second, 2) && check (third, 3) && check(fourth, 4) ){
    System.out.println("your ip is valid");
}

注意-这只会显示第一个无效的八位字节-如果你想检查所有内容,你需要另一个布尔

boolean result = check(first,0) && 
    check (second, 2) && 
    check (third, 3) && 
    check(fourth, 4); //reveals all errors

使用完全不同的方法http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByName%28java.lang.String%29

try{
    /*InetAdress adress =*/ InetAdress.
        getByName(""+first+"."+second+"."+third+"."+forth)
    System.out.println("your ip is valid");
}catch (UnknownHostException e){
    //TODO represent that error message into a nice expression
    System.out.println("your ip is invalid");
}

但这也没有提供关于无效的八位字节的信息。。。

(顺便说一句,你的代码有什么问题?真的很好!)

我只是觉得无聊,写了这个regexp

public static boolean isValid(String ip) {
    boolean isvalid;
    isvalid = ip.matches(
            "(([0-9]|[0-9]{0,2}|1[0-9]*{0,2}|2[0-5][0-5]|0{0,3}).){3}" +
             "([0-9]|[0-9]{0,2}|1[0-9]*{0,2}|2[0-5][0-5]|0{0,3})"
    );
    return isvalid;
}

并在以下数据集上进行了测试:

String[] ips = {
        "0.0.0.0",
        "0.111.222.0",
        "0.0.0.000",
        "0.00.0.000",
        "1.1.1.1",
        "2.2.2.2",
        "12.13.14.15",
        "29.29.29.29",
        "99.99.000.1",
        "111.102.144.190",
        "255.255.199.199",
        "266.255.255.255", //inv
        "255.265.255.255", //inv 
        "255.255.258.255", //inv 
        "255.255.255.259", //inv 
        "299.100.110.255" //inv
    };
    for (String s : ips) {
        if (isValid(s) == false) {
            System.err.println(s + " is invalid");
        }
    }

最新更新