判断某个ip是否在[start,end]两个ip的范围内,即判断start≤ip≤end是否符合。

首先分析start≤ip。

因为ip的一般形式为 "a.b.c.d",通过 .将整个ip分为四段。假设判断的ip为{a,b,c,d},start为{a1,b1,c1,d1}。从左开始分析的话,每段有小于、等于、大于三个比较关系。如果a>a1,直接就能说明ip>start,不用再继续判断start后面的段;如果a=a1,则需要继续判断start剩下部分;如果a<a1,说明ip<start,直接返回false即可。

因为还存在start=ip的情况,所以需要保留循环的次数,如果比较到最后一段,说明start≤ip。

end的比较与start同理。

代码如下:

public static boolean ipInRange(String ip,String start,String end){
        String[] ips=ip.split("\\\\.");
        String[] starts=start.split("\\\\.");
        String[] ends=end.split("\\\\.");
        boolean flags=false,flage=false;  //flags为true代表ip已经符合start,不用判断;flage标记end
        int i=0;
        for (; i <ips.length; i++){
            int t_ip=Integer.parseInt(ips[i]);
            int t_start=Integer.parseInt(starts[i]);
            int t_end=Integer.parseInt(ends[i]);
            if(!flags){   
                if(t_ip>t_start){
                    flags=true;   //说明start不用判断了
                }else if(t_ip<t_start){
                    return false;   //说明ip小于start
                }
            }
            if(!flage){
                if(t_ip<t_end){
                    flage=true;
                }else if(t_ip>t_end){
                    return false;
                }
            }
        }
        return (flags&&flage)||i==ips.length;  //i==ips.length为true代表ip从头判断到尾,说明ip与某个边界相等。
    }
    public static void main(String[] args) {
        System.out.println(ipInRange("192.168.215.253","192.168.215.1","192.168.215.252"));
    }