/***@author: yqq
* @date: 2019/5/8
* @description: ip地址与int之间互换
*https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247486894&idx=1&sn=bf17d404a989c3bb202241326d94647b&chksm=e8fe91a7df8918b1708f0cb759c6f9411d43ac22c257d56cc9191f74dc5eadd666862bb4bd92&scene=0&xtrack=1#rd*/
public classIPToString {/**&:全是1则为1,否则为 0
|:只要一个为1则为1,否则为0
十进制转成十六进制:
Integer.toHexString(int i)
十进制转成八进制
Integer.toOctalString(int i)
十进制转成二进制
Integer.toBinaryString(int i)
十六进制转成十进制
Integer.valueOf("FFFF",16).toString()
八进制转成十进制
Integer.valueOf("876",8).toString()
二进制转十进制
Integer.valueOf("0101",2).toString()*/
public static voidmain(String[] args) {
String[] ips4Test= new String[]{"0.0.0.0", "127.0.0.1","192.168.1.1", "255.0.0.255", "255.255.255.255"};for(String ip : ips4Test) {
test(ip);
}
}public static voidtest(String ip) {int ipInt =ip2Int(ip);
String ipString=int2Ip(ipInt);
System.out.println("用于测试的ip地址: " + ip + ", int表示: " + ipInt + ", 二进制: " +Long.toBinaryString(ipInt)+ ", 转回String: " + ipString + ",与测试 ip 地址是否相等: " +ip.equals(ipString));
}/*** 将 ip 字符串转换为 int 类型的数字
*
* 思路就是将 ip 的每一段数字转为 8 位二进制数,并将它们放在结果的适当位置上
*
*@paramipString ip字符串,如 127.0.0.1
*@returnip字符串对应的 int 值*/
public static intip2Int(String ipString) {//取 ip 的各段
String[] ipSlices = ipString.split("\\.");int rs = 0;for (int i = 0; i < ipSlices.length; i++) {//将 ip 的每一段解析为 int,并根据位置左移 8 位
int intSlice = Integer.parseInt(ipSlices[i]) << 8 *i;//求与
rs = rs |intSlice;
}returnrs;
}/*** 将 int 转换为 ip 字符串
*
*@paramipInt 用 int 表示的 ip 值
*@returnip字符串,如 127.0.0.1*/
public static String int2Ip(intipInt) {
String[] ipString= new String[4];for (int i = 0; i < 4; i++) {//每 8 位为一段,这里取当前要处理的最高位的位置
int pos = i * 8;//取当前处理的 ip 段的值
int and = ipInt & (255 <
ipString[i] = String.valueOf(and >>>pos);
}return String.join(".", ipString);
}
}