- 使用二分法实现查找ip所在的范围,并返回对应的id
start_ip end_ip code
0.0.0.0 1.0.0.255 1000000000
1.0.1.0 1.0.3.255 1156350100
1.0.4.0 1.0.7.255 1036000000
1.0.8.0 1.0.15.255 1156440100
java程序实现
行数据实体类
package IpRange; public class MyIp { private long startIP; private long endIP; private String code; //构造方法 public MyIp(long startIP, long endIP, String code) { this.startIP = startIP; this.endIP = endIP; this.code = code; } //空构造方法 public MyIp(){} //toString方法 @Override public String toString() { return "MyIp{" + "startIP=" + startIP + ", endIP=" + endIP + ", code='" + code + '\'' + '}'; } //get与set方法 public long getStartIP() { return startIP; } public void setStartIP(long startIP) { this.startIP = startIP; } public long getEndIP() { return endIP; } public void setEndIP(long endIP) { this.endIP = endIP; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
ip地址转换工具类
package IpRange; public class IPUtils { /** * ip地址转成long型数字 * 将IP地址转化成整数的方法如下: * 1、通过String的split方法按.分隔得到4个长度的数组 * 2、通过左移位操作(<<)给每一段的数字加权,第一段的权为2的24次方,第二段的权为2的16次方,第三段的权为2的8次方,最后一段的权为1 * @param strIp * @return */ public static long ipToLong(String strIp) { String[]ip = strIp.split("\\."); return (Long.parseLong(ip[0]) << 24) + (Long.parseLong(ip[1]) << 16) + (Long.parseLong(ip[2]) << 8) + Long.parseLong(ip[3]); } /** * 将十进制整数形式转换成127.0.0.1形式的ip地址 * 将整数形式的IP地址转化成字符串的方法如下: * 1、将整数值进行右移位操作(>>>),右移24位,右移时高位补0,得到的数字即为第一段IP。 * 2、通过与操作符(&)将整数值的高8位设为0,再右移16位,得到的数字即为第二段IP。 * 3、通过与操作符吧整数值的高16位设为0,再右移8位,得到的数字即为第三段IP。 * 4、通过与操作符吧整数值的高24位设为0,得到的数字即为第四段IP。 * @param longIp * @return */ public static String longToIP(long longIp) { StringBuffer sb = new StringBuffer(""); // 直接右移24位 sb.append(String.valueOf((longIp >>> 24))); sb.append("."); // 将高8位置0,然后右移16位 sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16)); sb.append("."); // 将高16位置0,然后右移8位 sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8)); sb.append("."); // 将高24位置0 sb.append(String.valueOf((longIp & 0x000000FF))); return sb.toString(); } public static void main(String[] args) { System.out.println(ipToLong("219.239.110.138")); System.out.println(longToIP(18537472)); } }
ip查找类的实现
package IpRange; import java.io.*; import java.util.LinkedList; public class IpRange { /** * *@author *** *@date *二分查找法 */ public static MyIp getIpCode(String ip){ MyIp[] myIps=getmyip(); if(myIps==null||myIps.length==0) return null; long iplong=IPUtils.ipToLong(ip); if(iplong<myIps[0].getStartIP()||iplong>myIps[myIps.length-1].getEndIP()) return null; int left=0; int right=myIps.length-1; int mid=(left+right)/2; while (left<=right){ if(iplong<myIps[mid].getStartIP()) right=mid-1; if(iplong>myIps[mid].getStartIP()) left=mid+1; if(iplong>=myIps[mid].getStartIP()&&iplong<=myIps[mid].getEndIP()) return myIps[mid]; mid=(left+right)/2; } return null; } /** *@author *@date *读取文件转换成MyIp对象 */ public static MyIp[] getmyip(){ InputStreamReader inputStreamReader=null; BufferedReader bufferedReader=null; File file=new File("E:\\aaa\\iprule"); try { inputStreamReader=new InputStreamReader(new FileInputStream(file),"UTF-8"); bufferedReader=new BufferedReader(inputStreamReader); String line; LinkedList<MyIp> linkedList=new LinkedList<MyIp>(); while ((line=bufferedReader.readLine())!=null){ String[] ipranges=line.split(","); linkedList.add(new MyIp(IPUtils.ipToLong(ipranges[0]),IPUtils.ipToLong(ipranges[1]),ipranges[2])); } MyIp[] myIps=linkedList.toArray(new MyIp[]{}); return myIps; } catch (IOException e) { e.printStackTrace(); } return null; } public static void main(String[] args) { MyIp myIp=getIpCode("1.2.16.15"); String code=myIp.getCode(); System.out.println("你所在的城市为:"+code); } }