先上代码了.它最原始的出处,应该是DZ!最近看的自家的老项目中也有这样一段.
本人不才,一段一段的分析,目前发现有个地方实在无法理解:if($ipbegin<0)$ipbegin+=pow(2,32);//什么情况下,$ipbegin<0呢???
还有一个问题就是:这个函数引用了一个qqwry.dat(刚开始差点写成bat).这个文件的原始出处在哪里呢,比如官网,和文档说明,如何用之类的信息?
查了百度百科,只有简短的介绍,还是找不到我想要的答案.
publicfunctionqqwry($ip='222.222.222.222'){//$fd->resource(24,stream)if(!$fd=@fopen("./Public/qqwry.dat",'rb')){return'InvalidIPdatafile';}$ip=explode('.',$ip);//$ipNum=2079656996$ipNum=$ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3];//获取IP地址索引开始和结束位置,此时两个变量输出是乱码(应该是二进制的原因)if(!($DataBegin=fread($fd,4))||!($DataEnd=fread($fd,4))){return;}//unpack()函数从二进制字符串对数据进行解包,L--无符号长整数//implode—Joinarrayelementswith(以)astring@$ipbegin=implode('',unpack('L',$DataBegin));//6153398//pow(x,y)--pow()函数返回x的y次方。if($ipbegin<0)$ipbegin+=pow(2,32);//什么情况下,$ipbegin<0呢???//implode—Joinarrayelementswith(以)astring@$ipend=implode('',unpack('L',$DataEnd));if($ipend<0)$ipend+=pow(2,32);$ipAllNum=($ipend-$ipbegin)/7+1;$BeginNum=$ip2num=$ip1num=0;$ipAddr1=$ipAddr2='';$EndNum=$ipAllNum;while($ip1num>$ipNum||$ip2num<$ipNum){//下面是一大段二分法,就不复制了
IP用二进制表示就是32bit,那么int也是32bit,用数字来存IP,查找效率和存储空间都更好
int的第一位是代表正负。所以有负数是正常的