Java —— 将IPV4地址转换为int
简介
朋友面试被问到这个问题,搜了一下答案,把demo记录一下,并附上注解。
基础理论
IPV4地址识别方法 —— 点分十进制
点分十进制(Dotted Decimal Notation)全称为点分(点式)十进制表示法,是IPv4的IP地址标识方法。IPv4中用四个字节表示一个IP地址,每个字节按照十进制表示为0到255。点分十进制就是用4个从0到255的数字,来表示一个IP地址。
如:192.168.1.1。
代码
public class Test {
public static void main(String[] args) throws Exception{
// 定义IP地址
String ip = "127.0.0.1";
System.out.println("ip.getBytes().length : " + ip.getBytes().length);
ip = ip.trim();
// 正则判断是否是IP
String regular = "^[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}$";
if(!ip.matches(regular)) {
throw new Exception("IP地址有误!");
} else {
System.out.println("的确是IP。");
}
// IP转化为int
// 每个IP通过Split"."截取出4段字符,再转换成二进制情况下,每段字符占8位下标,hex即是下标位置
// IPV4的IP转换成2进制就是32位,这是硬性的基础知识
int hex = 8;
int ipnum = 0;
// 如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
String[] iparray = ip.split("\\.");
for(int i=0; i<iparray.length; i++) {
System.out.println("每段:" + Integer.parseInt(iparray[i]));
if(Integer.parseInt(iparray[i]) > 255) {
throw new Exception("IP地址超过255");
}
int f = Integer.parseInt(iparray[i]);
System.out.println("f before : " + f);
f = f << (iparray.length - i - 1) * hex;
System.out.println("f after : " + f);
ipnum += f;
}
System.out.println("ipnum : " + ipnum);
String ipString = intTop(ipnum);
System.out.println("ipString : " + ipString);
}
/**
* int数转IP
* @param ipnum
* @return
*/
public static String intTop(int ipnum) {
String intnum = "";
int hex = 8;
int count = 1;
for (int j = 3; j > 0; j--) {
intnum += ipnum / ((count << (hex * j)) - 1);
ipnum %= count << (hex * j);
intnum += ".";
}
return intnum += ipnum;
}
}
总结
- IPV4地址每位最大不能超过255
- IPV4地址转是32位进制,每8位代表一段IP
- split一定要按照"\."方式编写
- 百度百科 IPV4