この記事は http://blog.chinaunix.net/uid-10697776-id-2935481.html から転載されました
?
?
?
ドットで区切られた 4 つのフィールドを持つ IP ネットワーク アドレス プロトコル アドレスを整数に変換するにはどうすればよいですか?たとえば、PHP には ip2long という関数があります。
echoip2long("10.2.1.3");<p>?></p>
echoip2long("10.2.1.3");<br>?>
を入手します
167903491これはどのように計算されますか? 現在、2 つのアルゴリズムがわかっています。 1 つの
functionip2int($ip){<p> //まず IP を 4 つのセグメント $ip1,$ip2,$ip3,$ip4<code>functionip2int($ip){<br> //我们先把ip分为四段,$ip1,$ip2,$ip3,$ip4<br> list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);<br> //然后第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256<br> //这即是我们得到的值<br> return$ip1*pow(256,3) $ip2*pow(256,2) $ip3*256 $ip4;<br>}<br>?>
list($ip1,$ip2,$ip3) に分割します,$ip4)=explode(".",$ip); //最初のセグメントに 256 の 3 乗を掛け、2 番目のセグメントに 256 の 2 乗を掛け、3 番目のセグメントに 256 を掛けます/ /これは取得する値
return$ip1*pow(256,3) $ip2*pow(256,2) $ip3*256 $ip4;}functionip2int($ip){<br> list($ip1,$ip2,$ip3,$ip4)=explode(".",$ip);<br> return($ip1<<24)|($ip2<<16)|($ip3<<8)|($ip4);<br>}<br>?>
?>
2 番目に、ビット演算を使用します
functionip2int($ip){
return($ip1<< 24)|($ip2<16)|($ip3<8)|($ip4);
}?>functionchk_ip($ip){<br> if(ip2long($ip)=="-1"){<br> returnfalse;<br> }<br> returntrue;<br>}<br>//应用<br>var_export(chk_ip("10.111.149.42"));<br>var_export(chk_ip("10.111.256.42"));<br>?>
</p> 整数に変換すると、一部の IP が負になることがわかります。これは、結果が符号付き整数であり、最大値が 2147483647 であるためです。符号なしに変換するには、<p> を使用できます。
</p> sprintf("%u",ip2long($ip);<p>
</p> は正の整数に変換できます。そして、得られた結果は、通常、long2ip を使用して元の IP アドレスに変換できます。 ip2long を使用して、<p> などの IP が有効かどうかを確認することもできます。
</p>
<code>functionchk_ip($ip){<p>if(ip2long($ip)=="-1"){</p> returnfalse;<p>}</p>returntrue;<p>}</p>//アプリケーションvar_export(chk_ip("10.111.149.42"));<div class="clear">var_export(chk_ip("10.111.256.42"));?>
true と false を出力します
?
?
?
?
?
</div>