ホームページ  >  記事  >  バックエンド開発  >  PHPのIPアドレスとinteger_PHP間の変換の詳細説明チュートリアル

PHPのIPアドレスとinteger_PHP間の変換の詳細説明チュートリアル

WBOY
WBOYオリジナル
2016-07-13 16:56:59752ブラウズ

昨日、ユーザーの IP のソースを特定し、ユーザーの IP が存在するネットワーク セグメントのアドレスを入力する必要がありました。最初に実装する必要があるのは、IP アドレスを整数に変換することです。システム関数 ip2long と long2ip を見てみましょう

PHP には、IP アドレスを整数に変換できる組み込み関数 ip2long があります。

コードは次のとおりですコードをコピー
$ip = '210.110.11.49';

echo ip2long($ip);

出力:

-764540111

得られる結果は符号付き整数型であるため、出力整数型には負の符号が付きます。符号付き整数型の最大値は 2147483647 です。結果を符号なし型に変換するには、次のように記述できます

3530427185

long2ip を使用して整数を IP アドレスに変換します

コードは次のとおりですコードをコピー
$ip = '210.110.11.49';

$ip_int = ip2long($ip);

echo $ip."
";

echo $ip_int."
";

エコーlong2ip($ip_int);

出力:

210.110.11.49

-764540111
210.110.11.49

結果からわかるように、ip 型と整数型は関数を通じて完成させることができます。

システム機能の小さなバグ

このバグはインターネット全体で見つかります。これは基本的に、IP アドレスの特定のセグメントに先頭に 0 を追加することを意味します。まず、このバグの例を見てみましょう。

コードは次のとおりです変換結果が一致しません。IP の最初の番号の前に先頭の 0 を追加して、もう一度確認してみましょう
コードをコピー
$ip = '210.110.011.49';


$ip_int = ip2long($ip);

echo $ip."
";

echo $ip_int."
";

エコーlong2ip($ip_int);

出力:


210.110.011.49

-764540623

210.110.9.49

コードは次のとおりです変換結果はすべて間違っています。上記の例はすべて、先頭に 0 が追加されているため、変換結果にエラーが発生し、反転結果は元の変換された IP と一致しません
コードをコピー
$ip = '021.110.11.49';


$ip_int = ip2long($ip);

echo $ip."
";

echo $ip_int."
";

エコーlong2ip($ip_int);

出力:


021.110.11.49

292424497

17.110.11.49

変換原理

現在 2 つのアルゴリズムがあります:

最初と最初の段落に 256 の 3 乗を掛け、2 番目の段落に 256 の 2 乗を掛け、3 番目の段落に 256 を掛けて、最終的な合計を求めます

コードは次のとおりです$ip = '0210.110.11.49';

2番目に、ビット単位の演算子を使用します

コードをコピー

関数 ipToInt($ip){


$iparr = 爆発('.',$ip);

$num = 0;

for($i=0;$i

$num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1));

}

$num を返します;

}

echo $ip.'
';


$ip_int = ipToInt($ip);

echo $ip_int.'
';

エコーlong2ip($ip_int);

出力:

0210.110.11.49

3530427185

210.110.11.49

コードは次のとおりです コードをコピー


$ip = '0210.110.11.49';


関数 ipToInt($ip){

$iparr = 爆発('.',$ip);

return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3]));

}


echo $ip.'
';

$ip_int = ipToInt($ip);

echo $ip_int.'
';

エコーlong2ip($ip_int);


出力:

0210.110.11.49
-764540111
210.110.11.49

IPが合法かどうかを確認してください

まず自分で横断して検出してください

コードは次のとおりです コードをコピー


関数 check_ip($ip){

$iparr = 爆発('.',$ip);

foreach($iparr as $v){ if($v>255) return false }

true を返す;

}

エコー '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

エコー '
';

エコー '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));


出力:

210.285.11.49,bool(false)
210.205.11.49,bool(true)

2番目に、ip2longを使用して戻ります

コードは次のとおりです コードをコピー


関数 check_ip($ip){

if(ip2long($ip)) true を返す;

false を返す;

}


エコー '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

エコー '
';

エコー '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));


出力:

210.285.11.49,bool(false)
210.205.11.49,bool(true)

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/631547.html技術記事昨日は、ユーザーの IP のソースを特定し、ユーザーの IP が存在するネットワーク セグメントのアドレスを入力する必要がありました。最初のステップは、IP アドレスを整数に変換する関数を実装することでした。システム機能...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。