function bin2ip($bin){ $ip = ''; $bd = str_split($bin, 1); for($i = 4; $i > 0; $i--){ $ip .= "." . sprintf("%03d", implode('', unpack('s', $bd[$i-1] . chr(0)))); } return substr($ip, 1); } //-------------------------------------------------- $f = fopen('QQWry.Dat', 'r'); $c = fread($f, 4); $d = fread($f, 4); $index_begin = implode('', unpack('L', $c)); $index_end = implode('', unpack('L', $d)); if($index_begin < 0) $index_begin += pow(2, 32); if($index_end < 0) $index_end += pow(2, 32); $ip_num = ($index_end - $index_begin) / 7 + 1; echo "index begin at: $index_beginn"; echo "index end at: $index_endn"; echo "ip data count : $ip_numn"; $output = ''; for($i = 0; $i < $ip_num; $i++){ //檔案指標指到每個IP資料檔案的索引取得索引資料(7位元組)上 fseek($f, $i * 7 + $index_begin); $ip4 = fread($f, 4); //IP起始地址 if(strlen($ip4) < 4) exit('data file error'); $ip3 = fread($f, 3); //IP記錄位移地址 if(strlen($ip3) < 3) exit('data file error'); $dataseek = implode('', unpack('L', $ip3 . chr(0))); if($dataseek < 0) $index_ip_record += pow(2, 32); //指向記錄區 $dataseek 位置尋找記錄 fseek($f, $dataseek); $ipdata = fread($f, 4); //IP結束位址 if(strlen($ipdata) < 4) exit('data file error'); $area = ''; $country = ''; //讀一個標記位 $flag = fread($f, 1); if($flag == chr(1)){ //國家名位移標記位 模式一 0x01 $area1seek = fread($f, 3); if(strlen($area1seek) < 3) exit('data file error'); $area1seek = implode('', unpack('L', $area1seek . chr(0))); fseek($f, $area1seek); $flag = fread($f, 1); //可能又是標記位 } if($flag == chr(2)){ //國家地區 重新導向 $area1seek = fread($f, 3); if(strlen($area1seek) < 3) exit('data file error'); $area1seek = implode('', unpack('L', $area1seek . chr(0))); $flag = fread($f, 1); if($flag == chr(2)){ $area2seek = fread($f, 3); $area2seek = implode('', unpack('L', $area2seek . chr(0))); fseek($f, $area2seek); }else{ fseek($f, -1, SEEK_CUR); } while(($c = fread($f, 1)) != chr(0)) $area .= $c; fseek($f, $area1seek); while(($c = fread($f, 1)) != chr(0)) $country .= $c; }else{ fseek($f, -1, SEEK_CUR); while(($c = fread($f, 1)) != chr(0)) $country .= $c; $flag = fread($f, 1); //如果地區是重新導向的 if($flag == chr(2)){ $area2seek = fread($f, 3); $area2seek = implode('', unpack('L', $area2seek . chr(0))); fseek($f, $area2seek); }else{ fseek($f, -1, SEEK_CUR); } while(($c = fread($f, 1)) != chr(0)) $area .= $c; } $adata = trim($country) . trim($area); //$country是國家字串 , $area 是地區字串 } fclose($f); |