$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);