最近在做项目中要求将IP转换为Long类型的数据再进行存储, 在Java中好像没有能直接互相转换的工具类, 特此写个工具类记录一下:
package com.itstone.mok.test;
public class IP2LongUtil {
public static void main(String[] args) {
// 3232238895
System.out.println(ipToLong("192.168.13.47:19093"));
// 192.168.13.47
System.out.println(longToIP(3232238895L));
}
/**
* ip --> long:
* 1.将ip地址按字符串读入,用分隔符分割开后成为一个字符串数组{xyzo};
* 2.将数组里的字符串强转为Long类型后执行:x^24+y^16+z^8+o 得到最后的返回值;
* 3.这里的加权采用移位(<<)完成;
*
* @param ip ip地址
* @return 转换后的long类型值
*/
public static long ipToLong(String ip) {
String[] splits = ip.split(":");
// 将端口排除掉
String[] strArray = splits[0].split("\\.");
return (Long.parseLong(strArray[0]) << 24) +
(Long.parseLong(strArray[1]) << 16) +
(Long.parseLong(strArray[2]) << 8) +
(Long.parseLong(strArray[3]));
}
/**
* long --> ip:
* ip的第一部分:整数右移24位。
* ip的第二部分:整数先高8位置0.再右移16位。
* ip的第三部分:整数先高16位置0.再右移8位。
* ip的第四部分:整数高24位置0.
*
* @param longIp
* @return
*/
public static String longToIP(long longIp) {
return "" + (longIp >> 24) + "." +
((longIp & 0x00ffffff) >> 16) + "." +
((longIp & 0x0000ffff) >> 8) + "." +
(longIp & 0x000000ff);
}
}