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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
/**
* 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);
}
}
|
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
/**
* 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);
}
}
|