您的位置:首页 > 其它

利用位运算实现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地址转换为整形
     * @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"));
    }
    
}


不喜勿喷。。。。练手并记录。纯新手代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IP转换 位运算