まず、需要の理由
IP アドレスを整数ストレージに変換することは、データベースの最適化にとって非常に重要です。多くの人は IP アドレスを文字列型として保存します。データの量が膨大になると、リソースが大幅に消費されます。さらに、index の整形速度は文字列 index の速度よりもはるかに速いため、ip を使用してストレージを整形し、使用時にそのシェイプを ip に変換し直す必要があります。 PHPのIP変換について、この記事ではipv4について説明しますが、ipv6については説明しません。
2番目、システム組み込み関数IPの変換に使用される関数: ip2long
例:
$ip=” 60.6.205.138”; echo ip2long($ip);
IPの変換に使用される関数:long2ip
例:
$ip=”60.6.205.138”; $ipInt=ip2long($ip); echo long2ip($ipInt);
3 つの一般的な問題
1. IP アドレスが比較的大きい場合、変換された整数が最大整形範囲を超える可能性があります。符号付き整数の最大値は 2147483647 です。この値を超えると負の数になります。
解決策: $ip = binding(decbin(ip2long($ip)));
と書きます。 例:$ip = "192.168.10.1": $ip= bindec(decbin(ip2long($ip))); echo $ip;
説明: decbin 関数は 10 進数を 2 進数に変換し、bindec 関数は 2 進数を整数に変換します。
2. 一部の IP アドレスのプレフィックスが 0 の場合、変換が失敗します。
例:$ip = '021.110.11.49'; $ip_int = ip2long($ip); echo $ip."<br />"; echo $ip_int."<br />"; echo long2ip($ip_int);
ipを整数に変換し、再度ipに変換するとエラーが発生し、ipアドレスが元のipアドレスと一致しません。その理由は、先頭に 0 があるためです。
解決策:
まず、IP 変換シェーピングは次のことに基づいているため、最初のセクションは 256 の 3 乗で乗算され、2 番目のセクションは 256 の 2 乗で乗算され、3 番目のセクションは 256 の 2 乗で乗算されます。セクションは 256 で乗算され、最後に合計の結果が表示されます。$ip = '060.06.205.138'; function ipToInt($ip){ $iparr = explode('.',$ip); $num = 0; for($i=0;$i<count($iparr);$i++){ $num += intval($iparr[$i]) *pow(256,count($iparr)-($i+1)); } return $num; } echo $ip.'<br />';
説明:
intval は変数を整数型に変換します
pow(4,2) は 16 を返し、x の y 乗を返します
2 番目、ビット単位の演算子で解きます。
$ip = '060.06.205.138'; function ipToInt($ip){ $iparr = explode('.',$ip); return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3])); } echo $ip.'<br />'; $ipInt = ipToInt($ip); echo $ipInt.'<br />'; echo long2ip($ipInt);
ビット演算子のアルゴリズムは、現在の数値を左に 3 ビットシフトして現在の数値に 2 の 3 乗を乗算し、左のビットを 2 ビットシフトして 2 の 2 乗を乗算するだけです。右シフト演算は、指定されたビット数だけバイナリ ビット オペランドを右に移動します。シフトされたビットは、マシンに応じて、0 または符号ビットで埋められます。 。
理解できない場合は、最初の方法に従ってください。
この記事はここで終わります。ご質問がございましたら、メッセージを残してください。一緒に話し合います。もっと練習して感動を深めてくださいね!
以上、ip2long-long2ip の側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。