Cidr.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\dns\utils;
  3. class Cidr
  4. {
  5. public static function validate($ip, $block)
  6. {
  7. return self::getBiggestBlock($ip) <= $block && intval($block) <= 32;
  8. }
  9. public static function getBiggestBlock($ipinput)
  10. {
  11. return self::maskAsCidr(long2ip(-(ip2long($ipinput) & -(ip2long($ipinput)))));
  12. }
  13. public static function maskAsCidr($netmask)
  14. {
  15. return self::isNetmaskValid($netmask) ? self::countBits(ip2long($netmask)) : 35;
  16. }
  17. public static function isNetmaskValid($netmask)
  18. {
  19. $netmask = ip2long($netmask);
  20. if ($netmask === false) return false;
  21. $neg = ((~(int)$netmask) & 0xFFFFFFFF);
  22. return (($neg + 1) & $neg) === 0;
  23. }
  24. public static function countBits($val)
  25. {
  26. $val = $val & 0xFFFFFFFF;
  27. $val = ($val & 0x55555555) + (($val >> 1) & 0x55555555);
  28. $val = ($val & 0x33333333) + (($val >> 2) & 0x33333333);
  29. $val = ($val & 0x0F0F0F0F) + (($val >> 4) & 0x0F0F0F0F);
  30. $val = ($val & 0x00FF00FF) + (($val >> 8) & 0x00FF00FF);
  31. $val = ($val & 0x0000FFFF) + (($val >> 16) & 0x0000FFFF);
  32. $val = $val & 0x0000003F;
  33. return $val;
  34. }
  35. public static function rangeAsCidrList($startIP, $endIP = null)
  36. {
  37. $start = ip2long($startIP);
  38. $end = (empty($endIP)) ? $start : ip2long($endIP);
  39. while ($end >= $start) {
  40. $maxBlock = self::getBiggestBlock(long2ip($start));
  41. $maxDifference = 32 - intval(log($end - $start + 1) / log(2));
  42. $size = ($maxBlock > $maxDifference) ? $maxBlock : $maxDifference;
  43. $cidrList[] = long2ip($start) . "/$size";
  44. $start += pow(2, (32 - $size));
  45. }
  46. return $cidrList;
  47. }
  48. public static function cidrAsRange($cidr)
  49. {
  50. $ipRange = array();
  51. $cidr = explode('/', $cidr);
  52. $ipRange[0] = long2ip((ip2long($cidr[0])) & ((-1 << (32 - (int)$cidr[1]))));
  53. $ipRange[1] = long2ip((ip2long($cidr[0])) + pow(2, (32 - (int)$cidr[1])) - 1);
  54. return $ipRange;
  55. }
  56. public static function cidrAsIpList($ip)
  57. {
  58. $range = self::cidrAsRange($ip);
  59. $result = array();
  60. for($ip = ip2long($range[0]); $ip < ip2long($range[1]); $ip++) {
  61. array_push($result, long2ip($ip));
  62. }
  63. return $result;
  64. }
  65. }