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 ...
随机推荐
- 算法笔记_184:历届试题 约数倍数选卡片(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数 ...
- 转:Python yield 使用浅析
初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关键字,然而,带有 yield 的函数执行流程却和普通函数不一样,yield 到底用来做什么,为什么要设计 yiel ...
- Eclipse Console 加大显示的行数和禁止错误弹出
在 Preferences-〉Run/Debug-〉Console里边,去掉对Limit console output的选择,或者选择,设置一下buffer size的设定值 禁止弹出: Prefer ...
- 感谢CSDN赠送的图书和杂志(5月份)
互联网的精神就是开放.就是分享.在分享的同一时候.我们也会收获到意外的回报. 近期.因为我在5月份发表了14篇博文,因此CSDN赠送了一本图书<软件系统架构>(本人自己选的)和一本< ...
- Zuul使用Ribbon配置自动重试
spring cloud的版本不断演进,导致很多配置的配置方式不断改变,有时某个配置在一个版本里面默认是true,后边一升级默认成了false,这点让人有点不爽. 言归正传 0.所使用版本 sprin ...
- 虚拟机和宿主机不能互ping的解决办法等
1. 虚拟机和宿主机不能互ping的解决办法:禁用无关虚拟网卡. 2. 有时有效光驱设备为cdrom1. 3. CentOS 6.3 图形界面切换用户:System->Log Out
- 微信小程序裁剪图片成圆形
代码地址如下:http://www.demodashi.com/demo/14453.html 前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在gith ...
- @Autowired(required = false)
标记在 方法上的时候,它会根据类型去spring容器中寻找 对于的形参并且注入. @Repository(value="userDao") public class UserDao ...
- SVN访问版本库精细的权限控制
SVN精细权限控制本章将详细介绍前一章所涉及的两个配置文件, svnserve.conf 和 authz.conf,通过对配置逐行的描述,来阐明其中的一些细节含义.除此之外的其他配置.安装等内容,不是 ...
- 将数据库dbcp连接池改为c3p0连接池(草稿,别点)
D:\Develop\apache-tomcat-7.0.52\bin\catalina.bat run[2017-12-26 02:31:29,174] Artifact pers:war expl ...