コードから始めましょう。元のソースは DZ でなければなりません。最近読んだ古いプロジェクトにもそのような文章がありました。
私には才能がないので、それを部分的に分析しました。本当に理解できない場所があることがわかりました。 :if($ipbegin < 0) $ipbegin += pow(2, 32); // どのような状況で $ipbegin<0 が実行されるのか。 ???
もう一つの質問は、この関数は qqwry.dat (最初はほぼ but と書かれていました) を参照しているということです。このファイルの元のソースはどこですか (公式 Web サイト、ドキュメント、使用方法など)。 ?
百度百科事典を確認しましたが、簡単な紹介しかありませんでしたが、まだ必要な答えが見つかりません。
public function qqwry($ip='222.222.222.222'){
//$fd->resource(24, ストリーム)
if(!$fd = @fopen("./Public/qqwry.dat", 'rb')) {
「無効な IP データ ファイル」を返します。
}
$ip =explode('.', $ip);
//$ipNum=2079656996
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
//IP アドレスのインデックスの開始位置と終了位置を取得します。このとき、2 つの変数の出力は文字化けします (バイナリであるはずです)。
if(!($DataBegin = fread($fd, 4)) || !($DataEnd = fread($fd, 4)) ){
戻る;
}
// unpack() 関数は、バイナリ文字列 L-unsigned long integer からデータを解凍します。
// implode — 配列要素を文字列に結合します
@$ipbegin = implode('', unpack('L', $DataBegin));// 6153398
//pow(x,y) -- pow() 関数は、x の y 乗を返します。
if($ipbegin < 0) $ipbegin += pow(2, 32); // どのような状況で $ipbegin<0 が実行されますか?
// implode — 配列要素を文字列に結合します
@$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) {
// 以下は二分法の大部分であるため、コピーしません
某草草2017-05-16 13:13:08
IPはバイナリで32ビットで表されるため、intも32ビットであり、IPを格納するのに数値を使用すると、検索効率とストレージスペースが向上します
int の最初の桁は正と負を表します。したがって、負の数があるのは正常です