zoukankan      html  css  js  c++  java
  • php ip转换省市县

    http://www.cz88.net/ip/

    http://www.ttlsa.com/php/php_cunzhen-ipdata/

    #  wget h http://6.scdx3.crsky.com/201307/qqwry0715.zip
    #  unzip qqwry0715.zip
    #  mv ip/qqwry.dat /data/site/test.ttlsa.com/qqwry.dat

    p
    class cls_ipAddress{
    private $fp;
    private $firstip;
    private $lastip;
    private $totalip;

    public function __construct($filename="qqwry.dat"){
    $this->fp=0;
    if(($this->fp=@fopen($filename,"rb"))!==false){
    $this->firstip=$this->getlong();
    $this->lastip=$this->getlong();
    $this->totalip=($this->lastip-$this->firstip)/7;
    register_shutdown_function(array(&$this,"__destruct"));
    }
    }

    public function __destruct(){
    if($this->fp){
    @fclose($this->fp);
    }
    $this->fp=0;
    }

    private function getlong(){
    $result=unpack("Vlong",fread($this->fp,4));
    return $result["long"];
    }

    private function getlong3(){
    $result=unpack("Vlong",fread($this->fp,3).chr(0));
    return $result["long"];
    }

    private function packip($ip){
    return pack("N",intval(ip2long($ip)));
    }

    private function getstring($data=""){
    $char=fread($this->fp,1);
    while(ord($char)>0){
    $data.=$char;
    $char=fread($this->fp,1);
    }
    return $data;
    }

    private function getarea(){
    $byte=fread($this->fp,1);
    switch(ord($byte)){
    case 0:
    $operators="";
    break;
    case 1:
    case 2:
    fseek($this->fp,$this->getlong3());
    $operators=$this->getstring();
    break;
    default:
    $operators=$this->getstring($byte);
    break;}
    return $operators;
    }

    public function getlocation($ip){
    if(!$this->fp){return null;}
    $location["ip"]=gethostbyname($ip);
    $ip=$this->packip($location["ip"]);
    $l=0;
    $u=$this->totalip;
    $findip=$this->lastip;
    while($l<=$u){
    $i=floor(($l+$u)/2);
    fseek($this->fp,$this->firstip+$i*7);
    $startip=strrev(fread($this->fp,4));
    if($ip<$startip){
    $u=$i-1;
    }else{
    fseek($this->fp,$this->getlong3());
    $endip=strrev(fread($this->fp,4));
    if($ip>$endip){
    $l=$i+1;
    }else{
    $findip=$this->firstip+$i*7;
    break;
    }
    }
    }
    fseek($this->fp,$findip);
    $location["startip"]=long2ip($this->getlong());
    $offset=$this->getlong3();
    fseek($this->fp,$offset);
    $location["endip"]=long2ip($this->getlong());
    $byte=fread($this->fp,1);
    switch(ord($byte)){
    case 1:
    $countryOffset=$this->getlong3();
    fseek($this->fp,$countryOffset);
    $byte=fread($this->fp,1);
    switch(ord($byte)){
    case 2:
    fseek($this->fp,$this->getlong3());
    $location["area"]=$this->getstring();
    fseek($this->fp,$countryOffset+4);
    $location["operators"]=$this->getarea();
    break;
    default:
    $location["area"]=$this->getstring($byte);
    $location["operators"]=$this->getarea();
    break;}
    break;
    case 2:
    fseek($this->fp,$this->getlong3());
    $location["area"]=$this->getstring();
    fseek($this->fp,$offset+8);
    $location["operators"]=$this->getarea();
    break;
    default:
    $location["area"]=$this->getstring($byte);
    $location["operators"]=$this->getarea();
    break;}
    if($location["area"]=="CZ88.NET"){
    $location["area"]="未知";
    }
    if($location["operators"]=="CZ88.NET"){
    $location["operators"]="未知";
    }
    return $location;
    }
    }

  • 相关阅读:
    python的thread模块作用
    Python2、3解释器inpurt()函数的区别
    python中的单例设计模式
    Python2、3解释器中字符串中的区别
    浏览器向服务器发送请求的请求头解析
    Python中输出函数print()的三个参数
    Python中四种交换两个变量的值的方法
    学习爬虫看着篇(基础篇)
    Python读写txt文件时的编码问题
    网页和自然语言处理中的字符问题(半角和全角)
  • 原文地址:https://www.cnblogs.com/vip-deng-vip/p/11412186.html
Copyright © 2011-2022 走看看