ip地址转整数

 

What/Where/Why:一般我们在论坛bbs上经常会看到一些封号的。情节严重的,版主会封锁该用户的所在地区的ip,使之无法登录,也会看到一些bbs的签名上有显示你当前用户所在地ip以及地区信息的,这个技术一般就是用在这里。而我主要用在一个投票的小模块中,用于判断该用户ip是否进行重复投票的时候使用,这里我只提供了一个工具类代码,而地区ip段我没有搜集,以后有时间了再整理。

 

       How:一个用户的ip,类似于”221.8.65.74”,而一般我们在java中存储于数据库,并不是把这个值当作字符串存储,是当作long类型存储。如何转化long类型呢,这里就应该介绍下ip地区段位的说法。

       在互联网中,各用户都是通过ip来区分的,不同地区的ip有它们自己的ip区间,我们可以把用户ip比喻为电话号码,而区间,则表示电话号码中的区号,比如上面所说的”221.8.65.74”ip,它是属于吉林省的,因为吉林省的ip段是3 708 289 023 3 708 420 094,一个ip地址是由4个段位组成,分别用“.”来区分,而区间号呢,则是ip转化为整数后的一个整数区间,上面的地址,转化为整数后是“3 708 305 738吉林区间所以属于吉林下面介绍如何转化整数

       这里的转化,我们就需要用到位移运算来解释了,我们需要把ip地址中的每个段位转化为8位的二进制数,不足8位的,要用0来补足,然后依次把这4个段位依次首尾相连,得到一个新的二进制数,然后把这个二进制数转化为十进制数,即可。举例:221.8.65.74,括号内为对应的二进制,分为22111011101)、800001000)、6501000001)、7401001010),然后首尾相连得到11011101 00001000 01000001 01001010,转化为十进制后得到3 708 305 738用代码表示:


	public static long getIpNum(String ip){
		long ipNum = 0;
		if(ip != null && ip.trim().length() != 0){
			String [] subips = ip.split("\\.");
			for(String str : subips){
				//向左移8位
				ipNum = ipNum << 8;
				ipNum += Integer.parseInt(str);
			}
		}
		return ipNum;
	}
	

 

 

总结:这个转化是在一本书上看的,感觉以后应该有用,记下备忘,代码的实现比较简单,没多大的技术含量,主要还是理解它的生成方式。各省的段位区间在网上貌似有数据,暂时没有收集,等什么时候有时间了整理后再补上。

 

你可能感兴趣的:(互联网,bbs)