php - 一段用于判断IP地址属于哪个城市的代码中,有一段写法为什么要考虑负值 ?

 泄漏磁的_956 发布于 2022-11-28 05:49

先上代码了.它最原始的出处,应该是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){//下面是一大段二分法,就不复制了
1 个回答
    • IP用二进制表示就是32bit,那么int也是32bit,用数字来存IP,查找效率和存储空间都更好

    • int的第一位是代表正负。所以有负数是正常的

    2022-11-28 07:03 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有