`

Ip处理工具类

    博客分类:
  • Java
 
阅读更多
public class IpUtis {

    /**
     * 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx
     * 
     * @param ip
     * @return
     */
    public static String getIpFromLong(Long ip) {
        String s1 = String.valueOf((ip & 4278190080L) / 16777216L);
        String s2 = String.valueOf((ip & 16711680L) / 65536L);
        String s3 = String.valueOf((ip & 65280L) / 256L);
        String s4 = String.valueOf(ip & 255L);
        return s1 + "." + s2 + "." + s3 + "." + s4;
    }

    /**
     * 把xx.xx.xx.xx类型的转为long类型的
     * 
     * @param ip
     * @return
     */
    public static Long getIpFromString(String ip) {
        Long ipLong = 0L;
        String ipTemp = ip;
        ipLong = ipLong * 256 + Long.parseLong(ipTemp.substring(0, ipTemp.indexOf(".")));
        ipTemp = ipTemp.substring(ipTemp.indexOf(".") + 1, ipTemp.length());
        ipLong = ipLong * 256 + Long.parseLong(ipTemp.substring(0, ipTemp.indexOf(".")));
        ipTemp = ipTemp.substring(ipTemp.indexOf(".") + 1, ipTemp.length());
        ipLong = ipLong * 256 + Long.parseLong(ipTemp.substring(0, ipTemp.indexOf(".")));
        ipTemp = ipTemp.substring(ipTemp.indexOf(".") + 1, ipTemp.length());
        ipLong = ipLong * 256 + Long.parseLong(ipTemp);
        return ipLong;
    }

    /**
     * 根据掩码位获取掩码
     * 
     * @param maskBit 掩码位数,如"28"、"30"
     * @return
     */
    public static String getMaskByMaskBit(String maskBit) {
        return StringUtils.isEmpty(maskBit) ? "error, maskBit is null !" : maskBitMap().get(maskBit);
    }

    /**
     * 根据 ip/掩码位 计算IP段的起始IP 如 IP串 218.240.38.69/30
     * 
     * @param ip 给定的IP,如218.240.38.69
     * @param maskBit 给定的掩码位,如30
     * @return 起始IP的字符串表示
     */
    public static String getBeginIpStr(String ip, String maskBit) {
        return getIpFromLong(getBeginIpLong(ip, maskBit));
    }

    /**
     * 根据 ip/掩码位 计算IP段的起始IP 如 IP串 218.240.38.69/30
     * 
     * @param ip 给定的IP,如218.240.38.69
     * @param maskBit 给定的掩码位,如30
     * @return 起始IP的长整型表示
     */
    public static Long getBeginIpLong(String ip, String maskBit) {
        return getIpFromString(ip) & getIpFromString(getMaskByMaskBit(maskBit));
    }

    /**
     * 根据 ip/掩码位 计算IP段的终止IP 如 IP串 218.240.38.69/30
     * 
     * @param ip 给定的IP,如218.240.38.69
     * @param maskBit 给定的掩码位,如30
     * @return 终止IP的字符串表示
     */
    public static String getEndIpStr(String ip, String maskBit) {
        return getIpFromLong(getEndIpLong(ip, maskBit));
    }

    /**
     * 根据 ip/掩码位 计算IP段的终止IP 如 IP串 218.240.38.69/30
     * 
     * @param ip 给定的IP,如218.240.38.69
     * @param maskBit 给定的掩码位,如30
     * @return 终止IP的长整型表示
     */
    public static Long getEndIpLong(String ip, String maskBit) {
        return getBeginIpLong(ip, maskBit) + ~getIpFromString(getMaskByMaskBit(maskBit));
    }

    /**
     * 根据子网掩码转换为掩码位 如 255.255.255.252转换为掩码位 为 30
     * 
     * @param netmarks
     * @return
     */
    public static int getNetMask(String netmarks) {
        StringBuffer sbf;
        String str;
        int inetmask = 0, count = 0;
        String[] ipList = netmarks.split("\\.");
        for (int n = 0; n < ipList.length; n++) {
            sbf = toBin(Integer.parseInt(ipList[n]));
            str = sbf.reverse().toString();
            count = 0;
            for (int i = 0; i < str.length(); i++) {
                i = str.indexOf('1', i);
                if (i == -1) {
                    break;
                }
                count++;
            }
            inetmask += count;
        }
        return inetmask;
    }

    /**
     * 计算子网大小
     * 
     * @param netmask 掩码位
     * @return
     */
    public static int getPoolMax(int maskBit) {
        if (maskBit <= 0 || maskBit >= 32) {
            return 0;
        }
        return (int) Math.pow(2, 32 - maskBit) - 2;
    }

    private static StringBuffer toBin(int x) {
        StringBuffer result = new StringBuffer();
        result.append(x % 2);
        x /= 2;
        while (x > 0) {
            result.append(x % 2);
            x /= 2;
        }
        return result;
    }

    /*
     * 存储着所有的掩码位及对应的掩码 key:掩码位 value:掩码(x.x.x.x)
     */
    private static Map<String, String> maskBitMap() {
        Map<String, String> maskBit = new HashMap<String, String>();
        maskBit.put("1", "128.0.0.0");
        maskBit.put("2", "192.0.0.0");
        maskBit.put("3", "224.0.0.0");
        maskBit.put("4", "240.0.0.0");
        maskBit.put("5", "248.0.0.0");
        maskBit.put("6", "252.0.0.0");
        maskBit.put("7", "254.0.0.0");
        maskBit.put("8", "255.0.0.0");
        maskBit.put("9", "255.128.0.0");
        maskBit.put("10", "255.192.0.0");
        maskBit.put("11", "255.224.0.0");
        maskBit.put("12", "255.240.0.0");
        maskBit.put("13", "255.248.0.0");
        maskBit.put("14", "255.252.0.0");
        maskBit.put("15", "255.254.0.0");
        maskBit.put("16", "255.255.0.0");
        maskBit.put("17", "255.255.128.0");
        maskBit.put("18", "255.255.192.0");
        maskBit.put("19", "255.255.224.0");
        maskBit.put("20", "255.255.240.0");
        maskBit.put("21", "255.255.248.0");
        maskBit.put("22", "255.255.252.0");
        maskBit.put("23", "255.255.254.0");
        maskBit.put("24", "255.255.255.0");
        maskBit.put("25", "255.255.255.128");
        maskBit.put("26", "255.255.255.192");
        maskBit.put("27", "255.255.255.224");
        maskBit.put("28", "255.255.255.240");
        maskBit.put("29", "255.255.255.248");
        maskBit.put("30", "255.255.255.252");
        maskBit.put("31", "255.255.255.254");
        maskBit.put("32", "255.255.255.255");
        return maskBit;
    }

    /**
     * 判断某个ip是否在一个网段内 ip/mask IP+掩码
     */
    public static boolean isInRange(String ip, String cidr) {
        String[] ips = ip.split("\\.");
        int ipAddr = (Integer.parseInt(ips[0]) << 24) | (Integer.parseInt(ips[1]) << 16)
                | (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]);
        int type = Integer.parseInt(cidr.replaceAll(".*/", ""));
        int mask = 0xFFFFFFFF << (32 - type);
        String cidrIp = cidr.replaceAll("/.*", "");
        String[] cidrIps = cidrIp.split("\\.");
        int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24) | (Integer.parseInt(cidrIps[1]) << 16)
                | (Integer.parseInt(cidrIps[2]) << 8) | Integer.parseInt(cidrIps[3]);

        return (ipAddr & mask) == (cidrIpAddr & mask);
    }

    /**
     * 判断IP地址是否内网IP
     * 
     * @param ipAddress
     * @return
     */
    public static boolean isInnerIP(String ipAddress) {
        boolean isInnerIp = false;
        long ipNum = getIpNum(ipAddress);
        /**
         * 私有IP:A类 10.0.0.0-10.255.255.255 B类 172.16.0.0-172.31.255.255 C类 192.168.0.0-192.168.255.255 当然,还有127这个网段是环回地址
         **/
        long aBegin = getIpNum("10.0.0.0");
        long aEnd = getIpNum("10.255.255.255");
        long bBegin = getIpNum("172.16.0.0");
        long bEnd = getIpNum("172.31.255.255");
        long cBegin = getIpNum("192.168.0.0");
        long cEnd = getIpNum("192.168.255.255");
        isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd)
                || ipAddress.equals("127.0.0.1");
        return isInnerIp;
    }

    private static long getIpNum(String ipAddress) {
        String[] ip = ipAddress.split("\\.");
        long a = Integer.parseInt(ip[0]);
        long b = Integer.parseInt(ip[1]);
        long c = Integer.parseInt(ip[2]);
        long d = Integer.parseInt(ip[3]);

        long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
        return ipNum;
    }

    private static boolean isInner(long userIp, long begin, long end) {
        return (userIp >= begin) && (userIp <= end);
    }

    /**
     * 将127.0.0.1 形式的IP地址转换成10进制整数
     * 
     * @param strIP
     * @return
     */
    public static long ipToTenLong(String strIP) {
        long[] ip = new long[4];
        // 先找到IP地址字符串中.的位置
        int position1 = strIP.indexOf(".");
        int position2 = strIP.indexOf(".", position1 + 1);
        int position3 = strIP.indexOf(".", position2 + 1);
        // 将每个.之间的字符串转换成整型
        ip[0] = Long.parseLong(strIP.substring(0, position1));
        ip[1] = Long.parseLong(strIP.substring(position1 + 1, position2));
        ip[2] = Long.parseLong(strIP.substring(position2 + 1, position3));
        ip[3] = Long.parseLong(strIP.substring(position3 + 1));
        return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
    }

    public static String ipToTwoString(String strIP) {
        long[] ip = new long[4];
        // 先找到IP地址字符串中.的位置
        int position1 = strIP.indexOf(".");
        int position2 = strIP.indexOf(".", position1 + 1);
        int position3 = strIP.indexOf(".", position2 + 1);
        // 将每个.之间的字符串转换成整型
        ip[0] = Long.parseLong(strIP.substring(0, position1));
        ip[1] = Long.parseLong(strIP.substring(position1 + 1, position2));
        ip[2] = Long.parseLong(strIP.substring(position2 + 1, position3));
        ip[3] = Long.parseLong(strIP.substring(position3 + 1));
        Long ten = (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
        return Long.toBinaryString(ten);
    }

    /**
     * 将10进制整数形式转换成127.0.0.1形式的IP地址
     * 
     * @param longIP
     * @return
     */
    public static String tenLongToIP(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(".");
        sb.append(String.valueOf((longIP & 0x0000FFFF) >>> 8));
        sb.append(".");
        sb.append(String.valueOf(longIP & 0x000000FF));
        return sb.toString();
    }

}

 

分享到:
评论

相关推荐

    java IP地址工具类,java IP地址获取,java获取客户端IP地址

    在Java编程中,获取IP地址是...总之,`IpUtils`是一个方便的Java工具类,它简化了IP地址的处理,使得开发者可以更专注于业务逻辑而不是网络底层的细节。通过深入学习和使用这个类,可以提高我们处理IP相关问题的效率。

    IP检查的工具类

    "IP检查的工具类"就是一个专为这个目的设计的程序模块,它可以帮助我们过滤和管理网络流量,确保服务的安全性和稳定性。下面将详细阐述这个工具类的功能、原理以及可能的应用场景。 首先,这个工具类的核心功能是...

    java工具类(包括bean操作工具类、浏览器读取工具累、汉字转拼音工具类、图片处理工具类、ip工具类、随机码工具类、json)

    java工具类(包括bean操作工具类、浏览器读取工具累、汉字转拼音工具类、图片处理工具类、ip工具类、随机码工具类、json)

    工具类-获取访问ip地址工具类,自用留存

    6. **异常处理**:在获取IP地址的过程中可能会遇到网络异常、解析错误等问题,因此工具类应包含适当的异常处理机制,确保程序的健壮性。 7. **性能优化**:对于高并发的网络应用,获取IP地址的效率也很重要。工具类...

    分类IP专用工具

    这类工具的主要功能是帮助用户快速地将IP地址分为两类:国内IP和国外IP。这在许多场景中都非常有用,例如网络管理、数据分析、网络安全监控以及优化网站性能等。 在描述中提到的“快速区分国内,国外IP”,意味着该...

    IP工具类,通过传入的request获取ip地址(JAVA)

    总结起来,无论是在传统的Servlet环境中还是在Reactive编程模型下,获取HTTP请求中的IP地址都需要处理可能存在的代理服务器情况。理解这些基础知识对于任何Java Web开发者来说都是至关重要的,它有助于确保我们的...

    java常用工具类

    文件工具类,Http请求工具类,图片处理工具类。...mail工具类,Map工具类,MD5编码工具类,数字工具类,随机数工具类,反射工具类,字符串处理工具类,URL工具类,XML工具类,常用的数据验证工具类

    端口扫描IP后的IP处理工具

    端口扫描IP后的IP处理工具通常指的是能够帮助用户管理和分析经过扫描后得到的大量IP数据的软件。这样的工具对于网络安全审计、漏洞检测以及网络资源管理具有重要意义。 "QQ吻IP整理工具.exe"可能是这样一个IP处理...

    java练手全程录4-处理工具类代码实现

    在"java练手全程录4-处理工具类代码实现"这个主题中,我们可能涉及到的是如何设计和实现一个高效的工具类,以提高代码复用性和模块化。 首先,我们要明白工具类的一般设计原则。一个优秀的工具类应该具有以下特点:...

    IP地址划分工具

    此外,这类工具可能还包含其他实用功能,如CIDR(无类别域间路由)表示法转换、IP地址范围计算、广播地址和网络地址的计算等。这些功能使得IP地址划分工具成为网络管理者的得力助手,能有效提高工作效率,减少人为...

    IPV6Util.rar

    在给定的"IPV6Util.rar"压缩包中,包含了一个名为"IPV6Util.java"的Java文件,这很可能是一个用于处理IPv6地址的工具类。这个类可能提供了对IPv6地址的多种操作,包括但不限于: 1. **IPv6段的拆分**:IPv6地址由8...

    三个工具类

    1. 数据处理工具类: 这种工具类通常包含一系列方法,用于数据的转换、验证、排序或计算。例如,它可以提供数字格式化、字符串拼接、日期时间处理等功能。例如,Java中的`java.util.Arrays`就是处理数组的工具类,...

    javaweb项目常用工具包

    Base64工具类-字符编码工具类-数据类型转换-日期工具类-Escape中文转码工具类-fastjson工具类-文件工具类-Http工具类-http请求工具类-用于模拟HTTP请求中GET/POST方式 -图片处理工具类-Ip工具类-mail工具类-Map工具...

    时间、IP转换工具

    在使用这类工具时,需要注意数据的准确性,并理解不同格式之间的关系,以便在各种应用场景中正确使用。 总的来说,时间、IP转换工具是IT专业人士不可或缺的辅助工具,无论是进行系统调试、网络配置还是数据分析,都...

    JAVA28个常用工具类

    8. **IpAddress.java**: IP地址处理工具类,可以解析和处理IP地址,包括IPv4和IPv6,可能包含获取本机IP、解析IP字符串、比较IP地址等功能。 9. **MatrixToImageWriterEx.java**: 这个工具类可能用于将二维数组...

    个人用的C#日常开发工具类

    - **字符串处理工具类**:包含各种字符串操作函数,如格式化、拼接、替换、检查等,增强字符串处理能力。 - **数据验证工具类**:提供输入验证功能,例如检查邮箱格式、电话号码合法性、日期范围等,确保数据输入的...

    Java基础之java处理ip的工具类

    本文将深入探讨如何使用Java处理IP地址,特别是通过一个名为`IPUtils`的工具类来实现各种IP转换和计算操作。 首先,`IPUtils`工具类提供了一个方法`getIpFromLong(Long ip)`,用于将长整型(long)的IP地址转换为...

    安卓开发框架工具类相关-安卓开发也会经常用到的28个java常用的工具类源码.zip

    4. **字符串处理工具类**: - 字符串格式化:如拼接、截取、替换、检查空值等,方便字符串处理。 - 正则表达式:用于验证和处理文本,如手机号码、邮箱格式的检查。 5. **日期和时间工具类**: - 时间格式转换:...

    java常用工具类封装util.rar

    1. **字符串处理工具类(StringUtil)**:此类通常包含处理字符串的各种方法,如字符串拼接、格式化、去除空白字符、判断是否为空、分割字符串等。例如`isEmpty()`用于检查字符串是否为空,`join()`用于连接字符串数...

    常用工具类常用工具类.zip

    在Java编程语言中,"工具类"通常指的是包含各种实用方法的类,这些方法可以用于执行常见的编程任务,而无需创建实例。它们通常是静态方法集合,可以被不同类方便地调用,提高了代码的可复用性和效率。下面我们将深入...

Global site tag (gtag.js) - Google Analytics