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
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); }} |
Java IP地址字符串与BigInteger的转换, 支持IPv6的更多相关文章
- IP地址字符串与BigInteger的转换
/** * Copyright (c) 2010, 新浪网支付中心 * All rights reserved. * * Java IP地址字符串与BigInteger的转换, * ...
- C# IP地址与整数之间的转换
IP地址与整数之间的转换 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数. 举例:一 ...
- JAVA IP地址转成长整型方法
JAVA IP地址转成长整型方法 代码例如以下: /** * IP转成整型 * @param ip * @return */ public static Long ip2int(String ip) ...
- IP地址字符串与int整数之间的无损转化
今天鹅厂店面,最后问了一个ip地址字符串和整数间无损转化的问题,晚上有时间了手撸了一下代码. public class IPstr { public static void main(String a ...
- ACM_“IP地址”普及(进制转换)
“IP地址”普及 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大家都知道最近广财大校园网提速,现在就跟大家普及一下简单的互联网 ...
- Python—IP地址与整数之间的转换
1. 将整数转换成IP: 思路:将整数转换成无符号32位的二进制,再8位进行分割,每8位转换成十进制即可. 方法一:#!usr/bin/python 2 #encoding=utf-8 3 #1. 将 ...
- Java ip地址查询,根据ip接口获得ip所在省市区,邮编,运营商等
早上一来,项目经理就说需要添加一个用户ip归属地查询功能,然后在网上搜罗半天,研究出一个比较简单的方法,通过接口返回地址json数据 有百度接口,新浪接口,这里用的是淘宝ip接口 通过淘宝IP地址库获 ...
- IP地址转、整数互相转换
知识点:一个二进制数,按位左移n位,就是把该数的值乘以2的n次方 二进制除二即右移一位 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255 ...
- Java获取IP地址,IpUtils工具类,Java IP地址获取
================================ ©Copyright 蕃薯耀 2020-01-17 https://www.cnblogs.com/fanshuyao/ import ...
随机推荐
- Linux 小知识点
1:当前目录比较重要的几个文件 . .. anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc install ...
- 【Linux】war包的解压与压缩
现在存在一个war包test.war(以下是在Linux上操作) 1.解压war包 jar –xvf test.war 说明:直接解压到当前文件夹,如果需要解压到指定的文件夹下,需要将test.war ...
- linux limits.conf 配置
转自:http://kerry.blog.51cto.com/172631/300784 limits.conf 文件实际是 Linux PAM(插入式认证模块,Pluggable Authentic ...
- function声明的深刻含义和jquery属性注入区别
在js中有两类对象 1.json对象,仅仅代表对象而已 2.function声明的对象 (1) 它定义了构造器 可以用new 对象 来初始化 数据对象 (2) 它指明对象是一个函数对象 通过后面加 ...
- Swing(Java)--维基百科
Swing是一个为Java设计的GUI工具包.Swing是Java基础类的一部分.Swing包括了图形用户界面(GUI)组件如:文本框,文本域,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏 ...
- 浅谈 JavaScriptCore
来源:XcodeMen(王瑞华) 链接:http://t.cn/RVqQI5p 本文由我们团队的王瑞华童鞋撰写. OS X Mavericks 和 iOS 7 引入了 JavaScriptCore 库 ...
- iOS archiveRootObject 归档失败问题
归档失败问题出在路径上,NSHomeDirectory() NSString *stringPath = [NSSearchPathForDirectoriesInDomains(NSDocument ...
- Python学习笔记015——文件file的常规操作之三(标准输入输出文件)
1 标准输入输出文件 在Python中,模块sys中含有标准的输入输出文件 sys.stdin 标准输入方法(一般是键盘) sys.stdout 标准输出方法(到显示器的缓冲输出) sys ...
- Google Guice之作用域
默认情况下,Guice获取一个实例时.每次都会返回一个新的对象. 这个行为能够通过scopes进行配置.Scopes同意你复用实例: 应用整个生命周期(@Singleton),会话(@Session) ...
- Python2 列表 cmp() 方法
描述 Python2 列表 cmp() 方法用于比较两个列表,如果 L1 < L2 返回 -1, 如果 L1 == L2 返回 0, 如果 L1 > L2 返回 1. 语法 cmp() 方 ...