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

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,但是不会有错误至少。最后就用或操作和以为运算就可以搞定。