php - IP アドレスがどの都市に属するかを決定するために使用されるコードで、コードを記述するときに負の値を考慮する必要があるのはなぜですか?
淡淡烟草味
淡淡烟草味 2017-05-16 13:11:08
0
1
801

コードから始めましょう。元のソースは 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) {
        // 以下は二分法の大部分であるため、コピーしません
淡淡烟草味
淡淡烟草味

全員に返信(1)
某草草
  • IPはバイナリで32ビットで表されるため、intも32ビットであり、IPを格納するのに数値を使用すると、検索効率とストレージスペースが向上します

  • int の最初の桁は正と負を表します。したがって、負の数があるのは正常です

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート