浏览 11728 次
锁定老帖子 主题:ip地址与数字(长整数)之间的转换
精华帖 (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地址字符串。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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的,数据超出范围了!谢谢 |
|
返回顶楼 | |
发表时间:2009-02-12
这样,如何与ip库里面进行对比呢?
|
|
返回顶楼 | |
发表时间: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]去匹配。 |
|
返回顶楼 | |
发表时间:2009-02-12
用Long型也会超过数据范围啊
Long.MAX_VALUE也只有2^63-1 而IPV4的地址最大可以是255.255.255.255 换成16进制就是0xFFFFFFFF 一共有64位,超过了Long的范围 你要将IP地址转换成数字的话,只能用BigInteger了 |
|
返回顶楼 | |
发表时间: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, 没有超出范围。 |
|
返回顶楼 | |
发表时间:2009-02-12
厄,貌似是我计算错了。。。
是32位,Long足够了 汗。。。 |
|
返回顶楼 | |