栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Java中,给定IP地址范围,返回覆盖该范围的最小CIDR块列表

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Java中,给定IP地址范围,返回覆盖该范围的最小CIDR块列表

我的最后一个答案中包含一些错误,这些错误是由于IP地址的第一个八位字节太大而引起的。这个效果更好。几乎完全从这里解除:http : //facedroid.blogspot.com/2010/06/ip-range-to-
cidr.html

import java.util.ArrayList;import java.util.List;public class RangeToCidr {    public static List<String> range2cidrlist( String startIp, String endIp ) {      long start = ipToLong(startIp);      long end = ipToLong(endIp);        ArrayList<String> pairs = new ArrayList<String>();      while ( end >= start ) {   byte maxsize = 32;   while ( maxsize > 0) {long mask = CIDR2MASK[ maxsize -1 ];long maskedbase = start & mask;     if ( maskedbase != start ) {        break;}     maxsize--;   }     double x = Math.log( end - start + 1) / Math.log( 2 );   byte maxdiff = (byte)( 32 - Math.floor( x ) );   if ( maxsize < maxdiff) {maxsize = maxdiff;   }   String ip = longToIP(start);   pairs.add( ip + "/" + maxsize);   start += Math.pow( 2, (32 - maxsize) );      }      return pairs;         }    public static final int[] CIDR2MASK = new int[] { 0x00000000, 0x80000000,          0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000,          0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000,          0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000,          0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800,          0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,          0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE,          0xFFFFFFFF };    private static long ipToLong(String strIP) {      long[] ip = new long[4];      String[] ipSec = strIP.split("\.");      for (int k = 0; k < 4; k++) {   ip[k] = Long.valueOf(ipSec[k]);      }        return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];         }    private static String longToIP(long longIP) {      StringBuffer sb = new StringBuffer("");      sb.append(String.valueOf(longIP >>> 24));      sb.append(".");      sb.append(String.valueOf((longIP & 0x00FFFFFF) >>> 16));      sb.append(".");      sb.append(String.valueOf((longIP & 0x0000FFFF) >>> 8));      sb.append(".");      sb.append(String.valueOf(longIP & 0x000000FF));        return sb.toString();         } }


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/570517.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号