论坛首页 入门技术论坛

ip地址与数字(长整数)之间的转换

浏览 11698 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-18   最后修改:2009-02-09
★★★ 本篇为原创,需要引用转载的朋友请注明:《 http://stephen830.iteye.com/blog/254742 》 谢谢支持! ★★★

在分析网站的客户来源经常会要求根据客户的ip地址去判断客户国家位置或者城市位置。当然要做到这一步,你要有一个详细的ip地址库。

ip地址库中一般是通过ip地址转换来的数字(长整数)来划分国家或者城市。ip地址库数据库的一般格式为:

...
startIpLongNumber   endIpLongNumber CountryName CountryCode CityName
...

而在应用中需要将客户的ip地址字符串转成一个长整数,然后才能到地址库中去查找。

下面就给出ip->long , long->ip的转换方法。

/**
     * ip地址转成整数.
     * @param ip
     * @return
     */
    public static long ip2long(String ip) {
    	String[] ips = ip.split("[.]");
    	long num =  16777216L*Long.parseLong(ips[0]) + 65536L*Long.parseLong(ips[1]) + 256*Long.parseLong(ips[2]) + Long.parseLong(ips[3]);
    	return num;
    }
    
    /**
     * 整数转成ip地址.
     * @param ipLong
     * @return
     */
    public static String long2ip(long ipLong) {
    	//long ipLong = 1037591503;
    	long mask[] = {0x000000FF,0x0000FF00,0x00FF0000,0xFF000000};
    	long num = 0;
    	StringBuffer ipInfo = new StringBuffer();
    	for(int i=0;i<4;i++){
    		num = (ipLong & mask[i])>>(i*8);
    		if(i>0) ipInfo.insert(0,".");
    		ipInfo.insert(0,Long.toString(num,10));
    	}
    	return ipInfo.toString();
    }


通过上面这2个方法,就可以很方便的将一个ip地址字符串折算为一个long数字;或者将一个long数字还原成一个ip地址字符串。
   发表时间:2009-02-09  
测试了一下好像不对嘛。

System.out.println(ip2long("203.208.37.104"));
System.out.println(long2ip(-875551384L));

System.out.println(ip2long("192.168.1.2"));
System.out.println(long2ip(-1062731518L));


输出:
-875551384
-53.208.37.104
-1062731518
-64.168.1.2
0 请登录后投票
   发表时间:2009-02-09  
xplazy 写道

测试了一下好像不对嘛。System.out.println(ip2long("203.208.37.104"));System.out.println(long2ip(-875551384L));System.out.println(ip2long("192.168.1.2"));System.out.println(long2ip(-1062731518L));输出:-875551384-53.208.37.104-1062731518-64.168.1.2


现在对了,原来默认是用int的,数据超出范围了!谢谢
0 请登录后投票
   发表时间:2009-02-12  
这样,如何与ip库里面进行对比呢?
0 请登录后投票
   发表时间:2009-02-12  
duronshi 写道
这样,如何与ip库里面进行对比呢?


一般ip库里面的数据按照如下格式

start_ip,end_ip,start_ip_num,end_ip_num,country_code,country_name
'112.63.162.116', '112.63.162.119', 1883218548, 1883218551, 'ES', 'Spain'
'112.63.162.120', '112.63.162.123', 1883218552, 1883218555, 'FR', 'France'
'112.63.162.148', '112.63.162.151', 1883218580, 1883218583, 'BE', 'Belgium'


所以要根据客户的ip计算出来的数字,与ip库中的[start_ip_num,end_ip_num]去匹配。
0 请登录后投票
   发表时间:2009-02-12  
用Long型也会超过数据范围啊
Long.MAX_VALUE也只有2^63-1
而IPV4的地址最大可以是255.255.255.255
换成16进制就是0xFFFFFFFF
一共有64位,超过了Long的范围

你要将IP地址转换成数字的话,只能用BigInteger了
0 请登录后投票
   发表时间:2009-02-12  
leeldy 写道
用Long型也会超过数据范围啊
Long.MAX_VALUE也只有2^63-1
而IPV4的地址最大可以是255.255.255.255
换成16进制就是0xFFFFFFFF
一共有64位,超过了Long的范围

你要将IP地址转换成数字的话,只能用BigInteger了


ip2long("255.255.255.255")=4294967295, 没有超出范围。
0 请登录后投票
   发表时间:2009-02-12  
厄,貌似是我计算错了。。。
是32位,Long足够了
汗。。。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics