background image

$EndNum

 = 

$useripAllNum

;

//使用二分查找法从索引记录中搜索匹配的 IP 地址记录
while

(

$userip1num

>

$useripNum

 || 

$userip2num

<

$useripNum

) {

$Middle

intval

((

$EndNum

 + 

$BeginNum

) / 2);

//偏移指针到索引位置读取 4 个字节

fseek

(

$fd

$useripbegin

 + 7 * 

$Middle

);

$useripData1

 = 

fread

(

$fd

, 4);

if

(

strlen

(

$useripData1

) < 4) {

fclose(

$fd

);

return

 'File Error';

}

//提取出来的数据转换成长整形,如果数据是负数则加上 2 的 32 次幂

$userip1num

 = implode('', unpack('L', 

$useripData1

));

if

(

$userip1num

 < 0) 

$userip1num

 += pow(2, 32);

//提取的长整型数大于我们 IP 地址则修改结束位置进行下一次循环
if

(

$userip1num

 > 

$useripNum

) {

$EndNum

 = 

$Middle

;

continue

;

}

//取完上一个索引后取下一个索引

$DataSeek

 = 

fread

(

$fd

, 3);

if

(

strlen

(

$DataSeek

) < 3) {

fclose(

$fd

);

return

 'File Error';

}

$DataSeek

 = implode('', unpack('L', 

$DataSeek

.

chr

(0)));

fseek

(

$fd

$DataSeek

);

$useripData2

 = 

fread

(

$fd

, 4);

if

(

strlen

(

$useripData2

) < 4) {

fclose(

$fd

);

return

 'File Error';

}

$userip2num

 = implode('', unpack('L', 

$useripData2

));

if

(

$userip2num

 < 0) 

$userip2num

 += pow(2, 32);

//找不到 IP 地址对应城市
if

(

$userip2num

 < 

$useripNum

) {

if

(

$Middle

 == 

$BeginNum

) {

fclose(

$fd

);

return

 'No Data';

}

$BeginNum

 = 

$Middle

;

}
}

$useripFlag

 = 

fread

(

$fd

, 1);