/** * Get low and high IP addresses for a specified range. * * @param array $ipRange An IP address range in presentation format * @return array|false Array ($lowIp, $highIp) in network address format, or false if failure */ static public function getIpsForRange($ipRange) { // in case mbstring overloads strlen function $strlen = function_exists('mb_orig_strlen') ? 'mb_orig_strlen' : 'strlen'; if(strpos($ipRange, '/') === false) { $ipRange = self::sanitizeIpRange($ipRange); } $pos = strpos($ipRange, '/'); $bits = substr($ipRange, $pos + 1); $range = substr($ipRange, 0, $pos); $high = $low = @_inet_pton($range); if($low === false) { return false; } $lowLen = $strlen($low); $i = $lowLen - 1; $bits = $lowLen * 8 - $bits; for($n = (int)($bits / 8); $n > 0; $n--, $i--) { $low[$i] = chr(0); $high[$i] = chr(255); } $n = $bits % 8; if($n) { $low[$i] = chr(ord($low[$i]) & ~((1 << $n) - 1)); $high[$i] = chr(ord($high[$i]) | ((1 << $n) - 1)); } return array($low, $high); }
/** * Get low and high IP addresses for a specified range. * * @param array $ipRange An IP address range in presentation format * @return array|false Array ($lowIp, $highIp) in network address format, or false if failure */ public static function getIpsForRange($ipRange) { if (strpos($ipRange, '/') === false) { $ipRange = self::sanitizeIpRange($ipRange); } $pos = strpos($ipRange, '/'); $bits = substr($ipRange, $pos + 1); $range = substr($ipRange, 0, $pos); $high = $low = @_inet_pton($range); if ($low === false) { return false; } $lowLen = Piwik_Common::strlen($low); $i = $lowLen - 1; $bits = $lowLen * 8 - $bits; for ($n = (int) ($bits / 8); $n > 0; $n--, $i--) { $low[$i] = chr(0); $high[$i] = chr(255); } $n = $bits % 8; if ($n) { $low[$i] = chr(ord($low[$i]) & ~((1 << $n) - 1)); $high[$i] = chr(ord($high[$i]) | (1 << $n) - 1); } return array($low, $high); }