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〗使用gsoap搭建web server(C)
1. gsoap的好处就不用说了:百度百科 2. gsoap的下载地址:项目地址,目前我使用的是2.8.15版本 3. 开发环境:Ubuntu13.10 4. 具体操作步骤(以简单相加为例): 1) ...
- 错误:google-chrome-stable-44.0.2403.157-1.x86_64.rpm 的公钥没有安装
错误:google-chrome-stable-44.0.2403.157-1.x86_64.rpm 的公钥没有安装 Fedora22 系统更新软件包.出现: warning: /var/cache/ ...
- __str__被print函数调用,目的是打印类的内容到屏幕上
# -*- coding: utf-8 -*- #python 27 #xiaodeng #__str__被print函数调用,目的是打印类的内容到屏幕上 class APIError(): def ...
- 使用String 的 intern做锁提高并发能力
一个场景: 某段代码只对同一个ip过来的请求同步处理: 比如ip为a的请求进入了同步代码块,那么后续的ip为a的请求则在代码块外边等着,这时来了一个ip为b的请求,那么这个请求也可以进去,也就是a的所 ...
- 使用c:forEach 控制5个换行
今天做项目的时候碰到一个问题,我须要显示不确定数目的图片在网页上(图片是从数据库查出来的),用的是<c:forEach>循环取值的.就须要做成一行显示固定个数的图片.代码例如以下(我这里是 ...
- 2016年度GitHub上Stars最多的10个项目
来源于:https://zhuanlan.zhihu.com/p/24627923 2016年接近尾声,在最近的几篇文章中,会整理总结一些2016年度开源项目.今天整理的是:2016年度GitHub最 ...
- javascript书籍推荐
本文转自:http://blog.csdn.net/yangnihaozan/article/details/48294545 在当下,极多的程序员是通过自学来完成入门以及提升的.对于JavaScri ...
- iphone 如何给cydia添加中文源和威锋源
http://zhidao.baidu.com/question/270663590.html英文的也没关系, 步骤是这样的, 1. 打开Cydia, 下面有五个项目, 然后选倒数第二个manage, ...
- NSUserDefault 的使用
1.NSUserDefault的使用: 作用:NSUserDefaults类提供了一个与默认系统进行交互的编程接口.NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等 ...
- python学习笔记013——包package
1 包(模块包)package 1.1 包的定义 包是将模块以文件夹的组织形式进行分组管理的方法 1.2 作用 分类管理,有利于防止命名冲突 可以在需要时加载一个或部分模块,而不是全部模块 mypac ...