package com.lizard.fastdb.util;
import java.net.InetAddress;
import java.util.StringTokenizer;
/**
* IP工具类,用于IP的转换
*
* @author SHEN.GANG
*/
public class IPUtils
{
/**
* long IP 转String IP
*
* @param ip
* long IP 地址
* @return 字符串 IP 地址
*/
public static String convertIPToString(long ip) {
String rtn = "";
try {
byte[] by = new byte[4];
InetAddress address = InetAddress.getByAddress(long2byte(by, ip, 0));
rtn = address.getHostAddress();
// 倒序
StringBuffer sb = new StringBuffer();
String ids[] = parseToken2String(rtn, ".");
// 应该是192.168.0.223
sb.append(ids[3]);
sb.append(".");
sb.append(ids[2]);
sb.append(".");
sb.append(ids[1]);
sb.append(".");
sb.append(ids[0]);
rtn = sb.toString();
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
return rtn;
}
/**
* 字符串IP转long IP
*
* @param ipStr 字符串ip地址
* @return 返回long的ip地址
*/
public static long convertIPToLong(String ipStr) {
try {
if (ipStr == null || ipStr.length() == 0)
return 0;
long addr = 0;
String b = "";
int tmpFlag1 = 0, tmpFlag2 = 0;
tmpFlag1 = 0;
tmpFlag2 = ipStr.indexOf(".");
b = ipStr.substring(tmpFlag1, tmpFlag2);
addr = new Long(b).longValue();
tmpFlag1 = tmpFlag2 + 1;
tmpFlag2 = ipStr.indexOf(".", tmpFlag1);
addr = addr << 8;
b = ipStr.substring(tmpFlag1, tmpFlag2);
addr += new Long(b).longValue();
tmpFlag1 = tmpFlag2 + 1;
tmpFlag2 = ipStr.indexOf(".", tmpFlag1);
addr = addr << 8;
b = ipStr.substring(tmpFlag1, tmpFlag2);
addr += new Long(b).longValue();
addr = addr << 8;
addr += new Long(ipStr.substring(tmpFlag2 + 1, ipStr.length())).longValue();
if (addr > 2147483647) {
addr -= Long.parseLong("4294967296");
}
return addr;
} catch (Exception e) {
return 0;
}
}
private static String[] parseToken2String(String str, String delim) {
String strRtn[] = null;
StringTokenizer st = new StringTokenizer(str, delim);
int length = st.countTokens();
strRtn = new String[length];
int i = 0;
while (st.hasMoreTokens()) {
String str1 = st.nextToken().trim();
strRtn[i] = str1;
i++;
}
return strRtn;
}
private static byte[] long2byte(byte[] out, long in, int offset) {
if (out.length > 0) {
out[offset] = (byte) in;
}
if (out.length > 1) {
out[offset + 1] = (byte) (in >>> 8);
}
if (out.length > 2) {
out[offset + 2] = (byte) (in >>> 16);
}
if (out.length > 3) {
out[offset + 3] = (byte) (in >>> 24);
}
if (out.length > 4) {
out[offset + 4] = (byte) (in >>> 32);
}
if (out.length > 5) {
out[offset + 5] = (byte) (in >>> 40);
}
if (out.length > 6) {
out[offset + 6] = (byte) (in >>> 48);
}
if (out.length > 7) {
out[offset + 7] = (byte) (in >>> 56);
}
return out;
}
}