ホームページ  >  記事  >  バックエンド開発  >  ip2to-to2ip

ip2to-to2ip

WBOY
WBOYオリジナル
2016-07-29 09:14:452693ブラウズ

まず、需要の理由

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 チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。