Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function ipVersion($ip)
- {
- return strpos($ip, ":") === false ? 4 : 6;
- }
- function inRange($ip, $ranges)
- {
- $ranges = (array)$ranges;
- $addressLength = ipVersion($ip) == 4 ? 32 : 128;
- foreach ($ranges as $range) {
- list($address, $cidr) = explode('/', $range);
- if ((bindec(ip2bin($ip)) & ~((1 << ($addressLength - $cidr)) - 1)) == bindec(ip2bin($address))) {
- return true;
- }
- }
- return false;
- }
- /**
- * Converts IP address to bits representation
- *
- * @param $ip string
- * @return string string of bits
- */
- function ip2bin($ip)
- {
- if (ipVersion($ip) == 4) {
- return str_pad(base_convert(ip2long($ip), 10, 2), 32, '0', STR_PAD_LEFT);
- } else {
- $unpack = unpack("A16", inet_pton($ip));
- $binStr = array_shift($unpack);
- $bits = 16; // 16*8 bit = 128 bit (IPv6)
- $result = '';
- while ($bits-- > 0) {
- $result = sprintf("%08b", isset($binStr[$bits]) ? ord($binStr[$bits]) : '0') . $result;
- }
- return $result;
- }
- }
- echo "\n2001:ab::1 as BIN(str): ";
- var_dump(ip2bin('2001:ab::1'));
- echo "same as DEC: ";
- var_dump(bindec(ip2bin('2001:ab::1')));
- echo "\n\nIPv4 10.0.1.5: ";
- var_dump(ip2bin('10.0.1.5'));
- echo "same as DEC: ";
- var_dump(bindec(ip2bin('10.0.1.5')));
- echo "\n\nAnd here is an IPv4 mask /30:";
- var_dump(decbin(~(1 << (32 - 30)) - 1));
- echo "\n\nBut unable to create a bit mask grater than int(32). For example /64:";
- var_dump(decbin(~(1 << (128-64)) - 1));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement