要求
存在一种虚拟IPv4地址,由4小节组成,每节的范围为0~255,以#号间隔,虚拟IPv4地址可以转换为一个32位的整数,例如128#0#255#255,转换为32位整数的结果为2147549183(0x8000FFFF)。1#0#0#0,转换为32位整数的结果为16777216(0x01000000)
现以字符串形式给出一个虚拟IPv4地址,限制第1小节的范围为1-128,(1~128)#(0-255)#(0-255)#(0-255),要求每个IPv4地址只能对应到唯一的整数上。如果是非法IPv4Q,返回invalid lP
输入描述
输入一行,虚拟IPv4地址格式字符串
输出描述
输出一行,按照要求输出整型或者特定字符
备注
输入不能确保是合法的IPv4地址,需要对非法IPV4(空串,含有IP地址中不存在的字符,非合法的#分十进制,十进制整数不在合法区间内)进行识别,返回特定错误
实现(开箱即用)
package com.des.data.test;
import jodd.util.StringUtil;
public class VirtualIPv4ToInteger {
public static void main(String[] args) {
String input = "100#101#1#5"; // 示例输入
System.out.println(covert(input));
}
private static String covert(String input) {
if (!digit(input)) {
return "invalid IP";
}
String[] dig = input.split("#");
if (dig.length != 4) {
return "invalid IP";
}
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < dig.length; i++) {
int num = Integer.parseInt(dig[i]);
if (i == 0 && (num < 1 || num > 128)) {
return "invalid IP";
}
if (num < 1 || num > 255) {
return "invalid IP";
}
String res=gethex(num);
stringBuffer.append(res);
}
return Long.parseLong(stringBuffer.toString(),16)+"";//可能出现超出Integer范围,所以用Long
}
private static String gethex(int in) {
String tmp = Integer.toHexString(in);//将整数转换为16进制字符串
if (tmp.length() < 2) {
tmp = "0" + tmp;
}
return tmp;
}
public static boolean digit(String input) {
if (StringUtil.isBlank(input)) {
return false;
}
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (!(Character.isDigit(c) || c == '#')) {
return false;
}
}
return true;
}
}