IP地址字符串与BigInteger的转换
/**
* 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);
}
}
IP地址字符串与BigInteger的转换的更多相关文章
- 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 ...
- C# IP地址与整数之间的转换
IP地址与整数之间的转换 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数. 举例:一 ...
- IP地址字符串与int整数之间的无损转化
今天鹅厂店面,最后问了一个ip地址字符串和整数间无损转化的问题,晚上有时间了手撸了一下代码. public class IPstr { public static void main(String a ...
- Python—IP地址与整数之间的转换
1. 将整数转换成IP: 思路:将整数转换成无符号32位的二进制,再8位进行分割,每8位转换成十进制即可. 方法一:#!usr/bin/python 2 #encoding=utf-8 3 #1. 将 ...
- IP地址转、整数互相转换
知识点:一个二进制数,按位左移n位,就是把该数的值乘以2的n次方 二进制除二即右移一位 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255 ...
- ACM_“IP地址”普及(进制转换)
“IP地址”普及 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大家都知道最近广财大校园网提速,现在就跟大家普及一下简单的互联网 ...
- MySQL内置函数:IP地址点分式与数字转换函数(INET_ATON/INET_NTOA)
前后转换,相比代码内部在进行移位简单太多了 SELECT INET_ATON('209.207.224.40'); SELECT INET_NTOA('578950');
- 将IP地址字符串转为32位二进制
def str2bin(s): temp = s.split('.') result = '' for i in range(len(temp)): temp[i] = str(bin(int(tem ...
- 整数与IP地址间的转换
描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数.举例:一个ip地址为10.0.3.193每段数字 ...
随机推荐
- 1103. Integer Factorization (30)
The K-P factorization of a positive integer N is to write N as the sum of the P-th power of K positi ...
- PIGCMS提示“你的程序为盗版,非法授权,请联系QQ7530782或者8441010”的修复方法
最近群里又有人发出来微信平台盗版源码这个问题求解决,其实我本人是一直支持正版的,大家有条件的还是购买正好为好,既然有人问我就顺便解决了下,其实很简单,再换个接口就好了,查看了一下是在\PigCms\L ...
- Jboss wildfly add JDBC driver
Jboss wildfly 添加 JDBC driver 我这里使用的是 wildfly-8.0.0.Final 第一步: 首先在modules里面添加mysql的驱动包 例如:modules\sy ...
- cocos3.2中如何创建一个场景
1.可以将一些比较通用的东西放到Common.h中,这是一个.h文件,必须手动添加,且保证在classes目录里 #ifndef __COMMON_H__ #define __COMMON_H__ # ...
- C++中使用心得
1.struct成员默认访问方式是public,而 class默认访问方式是private! 2.exit函数终止程序执行会调用析构函数 ,abort函数终止程序不会调用析构函数! 3.静态局部变量直 ...
- 将Asp.Net MVC应用程序的控制器定义在单独的程序集(类库)中
一直以来都想把控制器的代码部署到单独的程序集里.昨天研究Asp.Net MVC的源代码,偶然发现有一个奇特的类“ControllerBuilder”,MSDN上的介绍相当简略,就一句话“表示一个类,该 ...
- 《Dive into Python》Chapter 4 笔记
自省:Python中万物皆对象,自省是指代码可以查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作.用这种方法,可以定义没有名称的函数,不按函数声明的参数顺序调用函数,甚至引用 ...
- [转载]C# ListView用法详解
一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设 ...
- jQuery插件手把手教会(二)
上次我们将到了简单的jQuery插件,这次我们继续: 面向对象的插件开发 为什么要有面向对象的思维,因为如果不这样,你可能需要一个方法的时候就去定义一个function,当需要另外一个方法的时候,再去 ...
- 01-08-02【Nhibernate (版本3.3.1.4000) 出入江湖】二级缓存:NHibernate自带的HashtableProvider
第一步骤:hibernate.cfg.xml文件补上如下配置: <?xml version="1.0" encoding="utf-8"?> < ...