IP进行long和String互转
ip是个啥,ip是个4个byte,1byte有8bit中间用 '.'连接起来的串。
举个粒子:IP:202.203.158.148
其表示为二进制就是:11001010.11001011.10011110.10010100
对于二进制,如果我们想把它转成long类型脑子一热就是加起来,但是直接加起来容易恢复起来不容易。因为ip中的每个子段(比如202.203.158.148中我们姑且称202或203这样由 . 分隔的为一段)其最大值就255,二进制表示其不会超过8位,所以我们可以将其前面的段左移一定的位数来给后面的段挪个位置。最后面一段可以不要挪,因为转成了二进制,所以最后面一段的前面一段可以挪8位,最后面一段前面一段的前面一段挪16位,首段挪24位。倒过来(从右往左看就是正确的二进制值)大概就是下面这样子:
第一段:00000000 00000000 00000000 11001010 —> 移动方向 (高位)
第二段:00000000 00000000 11001011
第三段:00000000 10011110
第四段:10010100
四段相加得:11001010110010111001111010010100
将其转成十进制(级long类型)为: 3,402,342,036
现在这样子就可以愉快的加起来了,想用解析的时候转成二进制,只要第一段右移24为,第二段右移16位,第三段右移8位即为原来的值。
java实现
public class TestMethod {
public static void main(String[] args){
long l = new TestMethod().strIP2Long("202.203.158.148");
System.out.println(new TestMethod().longIP2String(l));
}
//ip string 转long
public long strIP2Long(String ip) {
String[] ipStrs = ip.split("\\.");
long firstIP = Long.valueOf(ipStrs[0]) << 24 ;
long second = Long.valueOf(ipStrs[1]) << 16;
long three = Long.valueOf(ipStrs[2]) << 8;
long last = Long.valueOf(ipStrs[3]) ;
return firstIP + second + three + last;
}
//long ip 转string
public String longIP2String(long longIP) {
String ipStr = Long.toString(longIP, 2);
String first = Long.toString(Long.parseUnsignedLong(ipStr.substring(0, 8),2), 10);
String second =Long.toString(Long.parseUnsignedLong(ipStr.substring(8, 16),2), 10);
String three = Long.toString(Long.parseUnsignedLong(ipStr.substring(16, 24),2), 10);
String last = Long.toString(Long.parseUnsignedLong(ipStr.substring(24, 32),2), 10);
return String.valueOf(first + "." + second + "." + three + "." + last);
}
}