Heim  >  Artikel  >  Backend-Entwicklung  >  求一个网段的开始、结束IP地址

求一个网段的开始、结束IP地址

WBOY
WBOYOriginal
2016-07-25 08:50:511851Durchsuche
求一个网段的开始、结束IP地址
比如:网段(192168.1.5/24),其子网掩码根据24划分为:
11111111.11111111.11111111.00000000(255.255.255.0)
说明:IP地址为32bits,24在划分网段中就表示前面有24个1,后面有8个0.
开始IP地址的算法是:192.168.1.5的二进制与子网掩码的二进制进行“与”运算出来的。
结束IP地址的算法是:子网掩码的二进制先取反,然后和192.168.1.5的二进制进行“或”运算
实际的就应用中,那样得出的是网络地址和广播地址,网络地址+1才是第一个主机地址,广播地址-1为最后一个主机地址。
  1. function mask2bin($n)
  2. {
  3. $n = intval($n);
  4. if($n32)
  5. die('error submask');
  6. return str_repeat("1", $n).str_repeat("0",32-$n);
  7. }
  8. function revBin($s)
  9. {
  10. $p=array('0','1','2');
  11. $r=array('2','0','1');
  12. return str_replace($p,$r,$s);
  13. }
  14. function startIp($str,$bSub)
  15. {
  16. $bIp = decbin($str);
  17. $bIp = str_pad($bIp,8,"0",STR_PAD_LEFT);
  18. $sIp = bindec($bIp & $bSub);
  19. return $sIp;
  20. }
  21. function endIp($str,$bSub)
  22. {
  23. $bIp = decbin($str);
  24. $bIp = str_pad($bIp,8,"0",STR_PAD_LEFT);
  25. $eIp = bindec($bIp | revBin($bSub));
  26. return $eIp;
  27. }
  28. $ip = array('192','168','1','5');//设定IP地址,可以从表单获取,这里只作演示
  29. $mask = '24'; //设置掩码
  30. $bSub = mask2bin($mask); //将子网掩码转换二进制
  31. $mask = array();
  32. $mask[] = substr($bSub,"0",8); //将子网掩码每8位分一段
  33. $mask[] = substr($bSub,"8",8);
  34. $mask[] = substr($bSub,"16",8);
  35. $mask[] = substr($bSub,"24",8);
  36. echo '
  37. 掩码:
  38. ';
  39. for ($i=0;$i{
  40. echo bindec($mask[$i]);
  41. if($i!=3)
  42. echo ".";
  43. }
  44. echo '
  45. 网络地址:
  46. ';
  47. for ($i=0;$i {
  48. echo startIp($ip[$i],$mask[$i]);
  49. if($i!=3)
  50. echo ".";
  51. }
  52. echo '
  53. 第一个可用:
  54. ';
  55. for ($i=0;$i {
  56. echo startIp($ip[$i],$mask[$i]);
  57. echo ".";
  58. }
  59. $ip_4 = startIp($ip[3],$mask[3]);
  60. echo ++$ip_4;
  61. echo '
  62. 最后可用:
  63. ';
  64. for ($i=0;$i {
  65. echo endIp($ip[$i],$mask[$i]);
  66. echo ".";
  67. }
  68. $ip_4 = endIp($ip[3],$mask[3]);
  69. echo --$ip_4;
  70. echo '
  71. 广播地址:
  72. ';
  73. for ($i=0;$i {
  74. echo endIp($ip[$i],$mask[$i]);
  75. if($i!=3)
  76. echo ".";
  77. }
  78. ?>复制代码


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn