IPv4的数据库存储和Int类型转换
IPv4可以以两种形式储存到数据库,第一种就是肉眼可以见的String类型,第二种就是转化为Int类型储存
//String Type
String ipStr = "127.0.0.1"
//Integer/Long Type
String ipNum = 2130706433;
之所以使用数字进行储存,我觉得是因为数字读写比较快,但是IPv6貌似不能转化为数字。目前还没遇到这个问题。
转化工具
Java的官方库并没有提供转化工具,所以需要借助第三方库或者自己写
手写转化工具
转化String类型到Long类型,转化出来的地址是无符号的Long型,因为255.255.255.255的地址转化完是『4294967295』,大于了Integer类型的最大范围,所以数据库中要使用『BIGINT』进行储存。
public static String integerToStringIPv4(int ip) {
return ((ip >> 24 ) & 0xFF) + "." +
((ip >> 16 ) & 0xFF) + "." +
((ip >> 8 ) & 0xFF) + "." +
( ip & 0xFF);
}
public static Long StringIPv4ToLong(String addr) {
String[] addrArray = addr.split("\\.");
long num = 0;
for (int i=0;i<addrArray.length;i++) {
int power = 3-i;
num += ((Integer.parseInt(addrArray[i])%256 * Math.pow(256,power)));
}
return num;
}
Google库com.google.common.net.InetAddresses
转化String类型到int类型,转化出来的地址是有符号的int基本类型,255.255.255.255的地址转化完是『-1』数据库中可以使用『INT』进行储存。
import com.google.common.net.InetAddresses;
import java.net.InetAddress;
import java.net.UnknownHostException;
public static String integerToStringIPv4Google(int ip) {
return InetAddresses.fromInteger(ip).toString();
}
public static Integer StringIPv4ToIntegerGoogle(String addr) {
try {
InetAddress javaInet = InetAddress.getByName(addr)
return InetAddresses.coerceToInteger(javaInet);
} catch (UnknownHostException e) {
return 0;
}
}