ipv4的字符串和int32互轉
據說實際開發會用到。之前我都是用的String的ip直接存Redis了,還是我孤陋寡聞了。
這裏試着用位運算實現了一下,不敢保證是最優寫法,如有更好的方式,還希望各位網友指點一下,哈哈。
下面直接上代碼:
public class Test{
@Test
public void testIPv4AndInt32() {
int ipv4Int32 = ipv4ToInt32("192.168.0.1");
String ipv4 = int32ToIpv4(ipv4Int32);
System.out.println("ipv4Int32 : " + ipv4Int32);
System.out.println("ipv4 : " + ipv4);
}
/**
* ipv4的字符串轉int32 數字
* @param ipv4 IP地址字符串
* @return int32
*/
public int ipv4ToInt32(String ipv4) {
String[] ipv4Parts = ipv4.split("\\.");
return Integer.parseInt(ipv4Parts[0]) << 24 | Integer.parseInt(ipv4Parts[1]) << 16 | Integer.parseInt(ipv4Parts[2]) << 8 | Integer.parseInt(ipv4Parts[3]);
}
/**
* int32數字轉String形式的ip字符串
* @param ipv4Int32 IP地址存儲在32位int數值中
* @return String
*/
public String int32ToIpv4(int ipv4Int32) {
StringBuilder sb = new StringBuilder();
sb.append(ipv4Int32 >>> 24).append('.')
.append(ipv4Int32 >>> 16 & ((1<<8)-1) ).append('.')
.append(ipv4Int32 >>> 8 & ((1<<8)-1) ).append('.')
.append(ipv4Int32 & ((1<<8)-1));
return sb.toString();
}
}
輸出如下:
ipv4Int32 : -1062731775
ipv4 : 192.168.0.1