【数据结构与算法】ip转int

思路比较简单,但是有一些坑。

class Error extends Exception{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	String msg;
	Error(String msg){
		this.msg = msg;
	}
}
public class Main {

	public static void main(String[] args) {
		Main m = new Main();
		try {
			System.out.println(m.convertIp("0.0.1.1"));
		} catch (Error e) {
			System.out.println(e.msg);
		}
	}
	
	private boolean isValid(String ip){
		if(ip == null)
			return false;
		String[] array = ip.split("\\.");
		if(array.length != 4)
			return false;
		for(String s : array){
			if(!isNumStr(s))
				return false;
		}
		return true;
	}
	
	private boolean isNumStr(String s){
		if(s == null || s.length() == 0)
			return false;
		if(!isAllDigit(s))
			return false;
		if(hasLeadingZero(s))
			return false;
		return true;
	}
	
	private boolean hasLeadingZero(String s){
		if(s.charAt(0) == '0' && s.length() != 1)
			return true;
		return false;
	}
	
	private boolean isAllDigit(String s){
		for(int i = 0; i < s.length(); i++){
			if(s.charAt(i) < '0' || s.charAt(i) > '9')
				return false;
		}
		return true;
	}
	
	private int convert(String s){
		int r = 0;
		for(int i = 0; i < s.length(); i++){
			int v = s.charAt(i) - '0';
			r += v;
			if(i != s.length() - 1)
				r *= 10;
		}
		return r;
	}
	
	public int convertIp(String s) throws Error{
		if(!isValid(s))
			throw new Error("string格式错误");
		String[] array = s.split("\\.");
		int[] iArray = new int[4];
		for(int i = 0; i < array.length; i++){
			int v = this.convert(array[i]);
			if(v < 0 || v > 192)
				throw new Error("越界");
			iArray[i] = v;
		}
		int r = 0;
		for(int i = 0; i < iArray.length; i++){
			r |= iArray[i];
			if(i != iArray.length - 1)
				r <<= 8;
		}
		return r;
	}
}

首先需要格式校验,包括:

是否为数字;

范围;

头零,检测头零的方式是看最高位是不是0,如果是0,那么位数必须是1,否则就有头零。

split的时候需要注意转义。

用4个byte拼成一个int时,需要注意4个8bit的值应该使用int而不是byte,因为java里面是没有无符号数存在的,byte类型是有符号的,所以byte存不下很大的8bit数,比如192。使用int存就好,只不过浪费了24个bit,但是不会有错误至少。最后就用或操作和以为运算就可以搞定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值