利用位运算实现IP转换 (字符串-整形)
2018-01-18 15:26
1251 查看
因为IP中每个数字都允许输入0-255中的整数,可以得出每一个数字都是2^8,所以一个字符型的IP可以用一个Integer(-2^31-2^31)类型来储存。用二进制来看就是每个数字占8位。把字符型的IP地址转换为数字就是把IP串中的每一个数字放到Integer 的不同位置,第一个数字放到Integer二进制表示中的最前面8位上,以此类推
数字转换为字符串型的IP反过来做即可
整合IP合法性判断,代码如下
不喜勿喷。。。。练手并记录。纯新手代码
/** * 字符串型IP地址转换为整形 * @param ipStr * @return 整形IP地址 */ Integer ipToInt(String ipStr) { if (!this.checkIp(ipStr)) { throw new RuntimeException("IP地址不合法"); } String[] arr = ipStr.split("\\."); int intIp =0; intIp += Integer.valueOf(arr[0]) << 24; //IP地址第一位,左移24位 intIp += Integer.valueOf(arr[1]) << 16; //IP地址第二位,左移16位 intIp += Integer.valueOf(arr[2]) << 8; //IP地址第三位,左移8位 intIp += Integer.valueOf(arr[3]); //IP地址第四位 return intIp; }
数字转换为字符串型的IP反过来做即可
/** * 整形IP转换为字符串型 * @param ipInt * @return 格式:0.0.0.0 */ String intToIP(Integer ipInt) { StringBuffer ipStr = new StringBuffer(); ipStr.append((ipInt >> 24) & 255).append(".") //右移24位与255进行"与(且)"运算,得出IP地址第一位 .append((ipInt >> 16) & 255).append(".") //右移16位与255进行"与(且)"运算,得出IP地址第一位 .append((ipInt >> 8) & 255).append(".") //右移8位与255进行"与(且)"运算,得出IP地址第一位 .append(ipInt & 255); //与255进行"与(且)"运算,得出IP地址第一位 return ipStr.toString(); }
整合IP合法性判断,代码如下
package com.test; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.junit.Test; /** * IP处理公共类 * @author Selecter Wang * @see 利用位运算处理IP地址整形与字符型的切换 * */ public class IPUtils { /** * 整形IP转换为字符串型 * @param ipInt * @return 格式:0.0.0.0 */ String intToIP(Integer ipInt) { StringBuffer ipStr = new StringBuffer(); ipStr.append((ipInt >> 24) & 255).append(".") //右移24位与255进行"与(且)"运算,得出IP地址第一位 .append((ipInt >> 16) & 255).append(".") //右移16位与255进行"与(且)"运算,得出IP地址第一位 .append((ipInt >> 8) & 255).append(".") //右移8位与255进行"与(且)"运算,得出IP地址第一位 .append(ipInt & 255); //与255进行"与(且)"运算,得出IP地址第一位 return ipStr.toString(); } /** * 字符串型IP地址转换为整形 * @param ipStr * @return 整形IP地址 */ Integer ipToInt(String ipStr) { if (!this.checkIp(ipStr)) { throw new RuntimeException("IP地址不合法"); } String[] arr = ipStr.split("\\."); int intIp =0; intIp += Integer.valueOf(arr[0]) << 24; //IP地址第一位,左移24位 intIp += Integer.valueOf(arr[1]) << 16; //IP地址第二位,左移16位 intIp += Integer.valueOf(arr[2]) << 8; //IP地址第三位,左移8位 intIp += Integer.valueOf(arr[3]); //IP地址第四位 return intIp; } /** * 检查IP合法性 * @param ipStr * @return */ Boolean checkIp(String ipStr) { String rexp = "(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}"; Pattern ipPattern = Pattern.compile(rexp); Matcher matcher = ipPattern.matcher(ipStr); return matcher.find(); } @Test public void test2() { System.out.println(this.intToIP(2130706433)); //127.0.0.1 System.out.println(this.intToIP(0)); //0.0.0.0 System.out.println(this.intToIP(-1)); //255.255.255.255 System.out.println(this.intToIP(-1062731519)); //192.168.1.1 System.out.println(); } @Test public void test3() { System.out.println(this.ipToInt("0.0.0.0")); System.out.println(this.ipToInt("127.0.0.1")); System.out.println(this.ipToInt("192.168.1.1")); System.out.println(this.ipToInt("255.255.255.255")); } }
不喜勿喷。。。。练手并记录。纯新手代码
相关文章推荐
- 利用Google Gson实现JSON字符串和对象之间相互转换
- 【C语言】编写函数实现库函数atoi,把字符串转换成整形(考虑数字过大)
- Json字符串和Java实体类之间的相互转换(利用jackson实现)
- 实现字符串到整形的转换
- 利用C++中的stringstream类轻松实现字符串和数字的互相转换
- 用perl实现IP地址字符串转换为单个IP
- 利用stringstream 类实现字符串和数值间转换
- C++实现16进制字符串转换成int整形值
- 实现整形转换成字符串
- 【C语言】编写函数实现库函数atoi,把字符串转换成整形
- C语言实现字符串IP与整数型IP的相互转换
- C/C++实现控制台密码隐藏和字符串转换为整形
- 【C语言】编写函数实现库函数atoi,把字符串转换成整形
- linux 内核中ip字符串与整数相互转换 手动实现inet_aton 与inet_ntoa 的功能
- 利用Google Gson实现JSON字符串和对象之间相互转换
- 面试中长间的strcpy、字符串整形相互转换、memcpy函数的实现
- UNIX常用的IP表示掩码方式转换为字符串的程序实现方法
- MySQL函数 IP 字符串和 整形转换 截取字符串
- 字符串训练03—自我实现atoi(字符串转整形) 如:“123”转换成 123 “-123” 转换成 -123
- 不用系统函数,实现输入一个整形数,输出其转换后的字符串,如输入整形1234,则转换后输出字符串“1234”,-1234转换为“-1234”。