“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进制的然后与数据库中的数据比较得出用户地址,不知道该怎么实现,请高手指教,谢谢!

解决方案 »

  1.   

    早上刚回过的.ip2long,long2ip
    http://community.csdn.net/Expert/topic/4313/4313904.xml?temp=.2074396
    用我的程序,将ip转成long,再转double应会吧?
      

  2.   

    呵呵,非常感谢您的提示,我试了一下,由于我对java语法了解的不够多,所以还是没有能搞弄出来,
    不好意思 ,我把你的程序作成了一个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);
    请麻烦您在指点一些 谢谢!
      

  3.   

    这是我写的一段将IP地址转换成long的程序
    比如是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 );
    }
    }
    }
      

  4.   

    如果能把这个long类型的数据直接转换成16进制是不是就得到了
    67108863这个值呢,又没有办法实现呢?
      

  5.   

    String ipStr="103.16.136.99"; 
    long ip=connect.ip2long(ipStr);
    这时的IP就已经是数值类型了,可以直接与数据库中的double比较
    如果你一定要转成double,JAVA可自动转换
    double ipE=ip;
    out.print(ipE); ///打出来为科学计数
      

  6.   

    long以Number存进数据库,不就是你要的结果吗?
      

  7.   

    /*** 
     * @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;
    }
      

  8.   

    原来那个67108863是16进制的啊,搞定import java.util.*;public class IpAddr
    {

    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") );

    }
    }