“ip1和ip2是指IP地址范围,就是和我们平常的IP表示方法不太一样,它的是把我们平常用的IP地址先用二进制表示,然后把中间的点去掉,这样就是一个32位长的二进制数,再转化为十六进制就是了。你也可以倒过来算。
比如67108863.00,67829758.00, "美国", "CZ88.NET" 中的
67108863转化为二进制就是1100111000100001000100001100011
加上点1100111.00010000.10001000.01100011
换为十进制就是103.16.136.99”我现在想反过来操作,因为数据库中是十六进制表示的ip(double类型的),我想从用户那得到ip以后,把它转换成16进制的然后与数据库中的数据比较得出用户地址,不知道该怎么实现,请高手指教,谢谢!
比如67108863.00,67829758.00, "美国", "CZ88.NET" 中的
67108863转化为二进制就是1100111000100001000100001100011
加上点1100111.00010000.10001000.01100011
换为十进制就是103.16.136.99”我现在想反过来操作,因为数据库中是十六进制表示的ip(double类型的),我想从用户那得到ip以后,把它转换成16进制的然后与数据库中的数据比较得出用户地址,不知道该怎么实现,请高手指教,谢谢!
http://community.csdn.net/Expert/topic/4313/4313904.xml?temp=.2074396
用我的程序,将ip转成long,再转double应会吧?
不好意思 ,我把你的程序作成了一个bean--connect,我是这样调用转换的:
String ipStr="103.16.136.99";
long ip=connect.ip2long(ipStr);
double ipE=double.ValueOf(ip);
out.print(ipE);然后提示这样的错误
class expected double ipE=double.ValueOf(ip);
请麻烦您在指点一些 谢谢!
比如是103.16.136.99
结果就是103×256×256×256+16×256×256+136×256+99
1729136739
即:1100111 00010000 10001000 01100011
可是我不知道你那个double类型的怎么转的public class IpAddr
{
public static void main(String[] args){
StringTokenizer st=new StringTokenizer("103.16.136.99",".");
String s="";
int i=24;
long addr=0;
while(st.hasMoreTokens()){
s=st.nextToken();
addr += ( (long)Integer.parseInt(s) )<<i;
i -= 8;
System.out.println( addr );
}
}
}
67108863这个值呢,又没有办法实现呢?
long ip=connect.ip2long(ipStr);
这时的IP就已经是数值类型了,可以直接与数据库中的double比较
如果你一定要转成double,JAVA可自动转换
double ipE=ip;
out.print(ipE); ///打出来为科学计数
* @param s
* 字符串
* @param s1
* 分割符号
* @param i
* 最小长度(象StringTokenizer 中最小长度应该设为了1,我们这里使用需要为0)
* @param x
* 返回的第n个字符
* @return s 返回字符串
*/
public static String GetField(String s, String s1, int i, int x) {
int j = s.length();
int k = s1.length();
int l = i;
String s2 = s;
if (j < i || j < k) {
String as[] = new String[1];
as[0] = s;
return as[0];
}
Vector vector = new Vector();
do {
int i1 = s2.indexOf(s1, l);
if (i1 < 0)
break;
vector.addElement(s2.substring(0, i1));
s2 = s2.substring(i1 + k, s2.length());
} while (true);
vector.addElement(s2);
String as1[] = new String[vector.size()];
for (int j1 = 0; j1 < vector.size(); j1++)
as1[j1] = vector.elementAt(j1).toString();
return as1[x];
}
/**
* 字符串IP 地址转化为整形
*
* @param s
* @return
*/
public static long IP2Long(String s) {
long l;
l = Long.parseLong(GetField(s, ".", 0, 0)) * 256 * 256 * 256;
l += Long.parseLong(GetField(s, ".", 0, 1)) * 256 * 256;
l += Long.parseLong(GetField(s, ".", 0, 2)) * 256;
l += Long.parseLong(GetField(s, ".", 0, 3));
return l;
}
{
public static String ipToHex(String ips){
StringTokenizer st=new StringTokenizer(ips,".");
String s="";
int i=24;
long addr=0;
while(st.hasMoreTokens()){
s=st.nextToken();
addr += ( (long)Integer.parseInt(s) )<<i;
i -= 8;
}
return Long.toHexString(addr);
}
public static void main(String[] args){
System.out.println( ipToHex("103.16.136.99") );
}
}