ipv4\v6转换long型




import java.math.BigInteger;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;

/**
 * 关于ip操作的工具类
 * 
 * @author djs
 * 
 */
public class IpUtils {
 
  /**
     * 将字符串形式的ip地址转换为long
     * 
     * @param ipInString
     *            字符串形式的ip地址
     * @return long形式的ip地址
     */
    public static long StringToLong(String ipInString) {
     
        ipInString = ipInString.replace(" ", "");
        byte[] bytes;
        if (ipInString.contains(":"))
            bytes = ipv6ToBytes(ipInString);
        else
            bytes = ipv4ToBytes(ipInString);
        BigInteger bigInt = new BigInteger(bytes);
        return bigInt.longValue();
    }

    /**
     * 将整数形式的ip地址转换为字符串形式
     * 
     * @param ipInBigInt
     *            整数形式的ip地址
     * @return 字符串形式的ip地址
     */
    public static String BigIntToString(BigInteger ipInBigInt) {
        byte[] bytes = ipInBigInt.toByteArray();
        byte[] unsignedBytes = Arrays.copyOfRange(bytes, 1, bytes.length);
        // 去除符号位
        try {
            String ip = InetAddress.getByAddress(unsignedBytes).toString();
            return ip.substring(ip.indexOf('/') + 1).trim();
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * ipv6地址转有符号byte[17]
     */
    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]
     */
    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 ipAdress ipv4或ipv6字符串
  * @return 4 :ipv4, 6:ipv6, 0:地址不对
  * @throws Exception
  */
 public static int isIpV4OrV6(String ipAdress) throws Exception {
  InetAddress address = InetAddress.getByName(ipAdress);
  if (address instanceof Inet4Address)
   return 4;
  else if (address instanceof Inet6Address)
   return 6;
  return 0;
 }
 

 /*
  * 验证IP是否属于某个IP段
  * 
  * ipSection IP段(以'-'分隔)
  * 
  * ip 所验证的IP号码
  */

 public static boolean ipExistsInRange(String ip, String ipSection) {

  ipSection = ipSection.trim();

  ip = ip.trim();

  int idx = ipSection.indexOf('-');

  String beginIP = ipSection.substring(0, idx);

  String endIP = ipSection.substring(idx + 1);

  return getIp2long(beginIP) <= getIp2long(ip)
    && getIp2long(ip) <= getIp2long(endIP);

 }

 public static long getIp2long(String ip) {

  ip = ip.trim();

  String[] ips = ip.split("\\.");

  long ip2long = 0L;

  for (int i = 0; i < 4; ++i) {

   ip2long = ip2long << 8 | Integer.parseInt(ips[i]);

  }
  return ip2long;

 }

 public static long getIp2long2(String ip) {

  ip = ip.trim();

  String[] ips = ip.split("\\.");

  long ip1 = Integer.parseInt(ips[0]);

  long ip2 = Integer.parseInt(ips[1]);

  long ip3 = Integer.parseInt(ips[2]);

  long ip4 = Integer.parseInt(ips[3]);

  long ip2long = 1L * ip1 * 256 * 256 * 256 + ip2 * 256 * 256 + ip3 * 256
    + ip4;

  return ip2long;

 }

 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值