/**
 * Copyright (c) 2010, 新浪网支付中心
 *      All rights reserved.
 *
 * Java IP地址字符串与BigInteger的转换,
 * 支持IPv6
 *
 */
 
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.UnknownHostException;
 
/**
 * IP转换大数进行比较工具
 *
 * @author yuchao1@staff.sina.com.cn
 * @since 2011-03-17
 *
 */
public final class IpLimit {
    //存放IP范围的内引类
    class IpRange{
        private String[][] ipRange;
        public IpRange(String[][] ip ){
            this.ipRange = ip;         
        }
        public String getIpAt(int row,int column){
            return ipRange[row][column];
        }
         
    }
    /**
     * 防止被实例化
     */
    private IpLimit() {
    }
 
    /**
     * 将字符串形式的ip地址转换为BigInteger
     *
     * @param ipInString
     *            字符串形式的ip地址
     * @return 整数形式的ip地址
     */
    public static BigInteger StringToBigInt(String ipInString) {
        ipInString = ipInString.replace(" ", "");
        byte[] bytes;
        if (ipInString.contains(":"))
            bytes = ipv6ToBytes(ipInString);
        else
            bytes = ipv4ToBytes(ipInString);
        return new BigInteger(bytes);
    }
 
    /**
     * 将整数形式的ip地址转换为字符串形式
     *
     * @param ipInBigInt
     *            整数形式的ip地址
     * @return 字符串形式的ip地址
     */
    public static String BigIntToString(BigInteger ipInBigInt) {
        byte[] bytes = ipInBigInt.toByteArray();
        byte[] unsignedBytes = bytes;
 
        // 去除符号位
        try {
            String ip = InetAddress.getByAddress(unsignedBytes).toString();
            return ip.substring(ip.indexOf('/') + 1).trim();
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        }
    }
 
    /**
     * ipv6地址转有符号byte[17]
     * @param   ipv6 字符串形式的IP地址
     * @return big integer number
     */
    private static byte[] ipv6ToBytes(String ipv6) {
        byte[] ret = new byte[17];
        ret[0] = 0;
        int ib = 16;
        boolean comFlag = false;// ipv4混合模式标记
        if (ipv6.startsWith(":"))// 去掉开头的冒号
            ipv6 = ipv6.substring(1);
        String groups[] = ipv6.split(":");
        for (int ig = groups.length - 1; ig > -1; ig--) {// 反向扫描
            if (groups[ig].contains(".")) {
                // 出现ipv4混合模式
                byte[] temp = ipv4ToBytes(groups[ig]);
                ret[ib--] = temp[4];
                ret[ib--] = temp[3];
                ret[ib--] = temp[2];
                ret[ib--] = temp[1];
                comFlag = true;
            } else if ("".equals(groups[ig])) {
                // 出现零长度压缩,计算缺少的组数
                int zlg = 9 - (groups.length + (comFlag ? 1 : 0));
                while (zlg-- > 0) {// 将这些组置0
                    ret[ib--] = 0;
                    ret[ib--] = 0;
                }
            } else {
                int temp = Integer.parseInt(groups[ig], 16);
                ret[ib--] = (byte) temp;
                ret[ib--] = (byte) (temp >> 8);
            }
        }
        return ret;
    }
 
    /**
     * ipv4地址转有符号byte[5]
     * @param ipv4 字符串的IPV4地址
     * @return big integer number
     */
    private static byte[] ipv4ToBytes(String ipv4) {
        byte[] ret = new byte[5];
        ret[0] = 0;
        // 先找到IP地址字符串中.的位置
        int position1 = ipv4.indexOf(".");
        int position2 = ipv4.indexOf(".", position1 + 1);
        int position3 = ipv4.indexOf(".", position2 + 1);
        // 将每个.之间的字符串转换成整型
        ret[1] = (byte) Integer.parseInt(ipv4.substring(0, position1));
        ret[2] = (byte) Integer.parseInt(ipv4.substring(position1 + 1,
                position2));
        ret[3] = (byte) Integer.parseInt(ipv4.substring(position2 + 1,
                position3));
        ret[4] = (byte) Integer.parseInt(ipv4.substring(position3 + 1));
        return ret;
    }
    /**
     *
     * @param tip   要限制的Ip 包括Ipv6
     * @param sip   限制的开始Ip
     * @param eip   限制的结束Ip
     * @return  Boolean true通过
     *      false 受限制
     */
    public static boolean IsIp(String tip,String[][] myRange){
        boolean flag = false;
        //tbig 要测试的大数
        BigInteger tbig = IpLimit.StringToBigInt(tip);
        int rangeLength = myRange.length;
         
        for(int i=0;i<rangeLength;i++)
        {
            for(int j=0;j<myRange[i].length;j++)
            {
                //开始大数sbig和ebig
                BigInteger sbig = IpLimit.StringToBigInt(myRange[i][j]);
                j = j+1;
                BigInteger ebig = IpLimit.StringToBigInt(myRange[i][j]);
                //将大数进行比较
                //如果相等则退出循环
                if((tbig.compareTo(sbig)) == 0){
                    flag = true;
                    break;
                }
                //如果不相等则比较大小,在区间内正常
                if(((tbig.compareTo(sbig)) == 1)
                        &&((tbig.compareTo(ebig)) == -1)){
                    flag = true;
                    break;
                }
                 
            }
        }
        return flag;
    }
    /**
     * 测试程序
     * @param args
     */
    public static void main(String args[]){
         
        /*
        String ip = new String("192.168.0.1");
        BigInteger number = IpLimit.StringToBigInt(ip);
        String sip = "192.168.10.0";
        String eip = "192.168.10.255";
        System.out.println("The number ="+number);
        boolean flag = false;
        flag = IpLimit.IsIp(ip, sip, eip);
        System.out.println("The int n="+flag);
        //System.out.println("the m ="+m);
         
        //String myip = IpLimit.BigIntToString(number);
        //System.out.println("The ipv4 ="+myip);
        String ip6 = "e80:a5eb:8fc8::7ec6:8027";
        //String ip6 = "21DA:D3:AD:2F3B::9C5A";
        BigInteger num = IpLimit.StringToBigInt(ip6);
        System.out.println("The Ipv6 number ="+num);
        String myip6 = IpLimit.BigIntToString(num);
        System.out.println("The IPv6 ="+myip6);
        */
         
        //单IP限制必须写全两个
        String[][] iplimit1 ={
                {"192.168.0.1","192.168.0.255"},
                {"10.210.71.0","10.210.71.255"},
                {"202.106.182.158","202.106.182.158"}
                };
        boolean flag = false;
        String ip = "202.106.182.158";
        flag = IpLimit.IsIp(ip, iplimit1);
        System.out.println("The first test ="+flag);
         
        String ip1 = "201.101.102.21";
        flag = IpLimit.IsIp(ip1, iplimit1);
        System.out.println("The other test ="+flag);
    }
}
 
本文转自:http://www.oschina.net/code/snippet_1434_3596

IP地址字符串与BigInteger的转换的更多相关文章

  1. Java IP地址字符串与BigInteger的转换, 支持IPv6

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  2. C# IP地址与整数之间的转换

    IP地址与整数之间的转换 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数. 举例:一 ...

  3. IP地址字符串与int整数之间的无损转化

    今天鹅厂店面,最后问了一个ip地址字符串和整数间无损转化的问题,晚上有时间了手撸了一下代码. public class IPstr { public static void main(String a ...

  4. Python—IP地址与整数之间的转换

    1. 将整数转换成IP: 思路:将整数转换成无符号32位的二进制,再8位进行分割,每8位转换成十进制即可. 方法一:#!usr/bin/python 2 #encoding=utf-8 3 #1. 将 ...

  5. IP地址转、整数互相转换

    知识点:一个二进制数,按位左移n位,就是把该数的值乘以2的n次方                  二进制除二即右移一位 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255 ...

  6. ACM_“IP地址”普及(进制转换)

    “IP地址”普及 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大家都知道最近广财大校园网提速,现在就跟大家普及一下简单的互联网 ...

  7. MySQL内置函数:IP地址点分式与数字转换函数(INET_ATON/INET_NTOA)

    前后转换,相比代码内部在进行移位简单太多了 SELECT INET_ATON('209.207.224.40'); SELECT INET_NTOA('578950');

  8. 将IP地址字符串转为32位二进制

    def str2bin(s): temp = s.split('.') result = '' for i in range(len(temp)): temp[i] = str(bin(int(tem ...

  9. 整数与IP地址间的转换

    描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数.举例:一个ip地址为10.0.3.193每段数字            ...

随机推荐

  1. WCF + EF 遇到的问题

    此文承接上一文章 基于WCF的API实现 http://www.cnblogs.com/heyixiaoran/p/4000695.html 由于上一次Entity部分没怎么写,到Services里识 ...

  2. vs2010的11个调试技巧和方法

    调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 这篇文章总结了可 ...

  3. odp.net以及oracle oledb安装

    连接Oracle数据库需要Oracle数据访问组件(ODAC). 1. 下载ODAC:http://www.oracle.com/technetwork/cn/database/windows/dow ...

  4. range,shuffle,str_shuffle

    print_r(range(1,20)); 输出,range产生 Array( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ...

  5. C++实现数字媒体二维图像变换

    C++实现数字媒体二维图像变换 必备环境 glut.h 头文件 glut32.lib 对象文件库 glut32.dll 动态连接库 程序说明 C++实现了用glut画正方形,画三角形的功能.并附带放大 ...

  6. spicy及remote-viewer登录方法

    spicy登录: $sudo spicy remote-viewer登录: $ sudo /usr/local/bin/remote-viewer $ spice://192.168.70.158:4 ...

  7. AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(二)

    上次已经建立了可运行的基本框架,这篇就说说怎么把我们自定义的View自动加载并添加到AvalonDock里面,AvalonDock里有3种类型的UI部件,Document, DockableConte ...

  8. Codeforces Round #222 (Div. 1) C. Captains Mode 对弈+dp

    题目链接: http://codeforces.com/contest/378/problem/E 题意: dota选英雄,现在有n个英雄,m个回合,两支队伍: 每一回合两个选择: b 1,队伍一ba ...

  9. Linux 命令整理 —— 用户管理

    Linux用户管理以读.写.执行动作为权限,以用户组为单位,限制用户行为.对于文件的的操作,可以限制读.写.执行中的哪一种,也可以限制文件所有者.组用户.组外用户相应的权限. 所以,要建立用户,最好先 ...

  10. WinForm点击按钮在对应的panel里画图

    panel在form1里,button在form1上方,panel在下面. 主要是在button1的click时间获取panel的画笔. 下面的不行,在panel里获取画笔,然后传到button1,根 ...