Нашел функцию для определения вхождения IP в заданный диапазон, она работает, но практики не хватает чтоб разобраться как она работает: PHP: function CheckIP(){ $ip_arr = explode ( '/' , '212.98.160.0/30' ); $network_long = ip2long($ip_arr [0]); $x = ip2long($ip_arr [1]); $mask = (long2ip($x) == $ip_arr[1]) ? $x : 0xffffffff << (32 - $ip_arr [1]); $ip_long = ip2long( "212.98.160.2" ); return ( $ip_long & $mask ) == ( $network_long & $mask ); } Стал разбирать: Разбиваем строку диапазона на начальный IP и префикс PHP: $ip_arr = explode ( '/' , '212.98.160.0/30' ); Конвертируем строку, содержащую IPv4-адрес в целое число PHP: $network_long = ip2long($ip_arr [0]); Это я не понял ибо это префикс, который является обычным числом, но не IPv4-адрес PHP: $x = ip2long($ip_arr [1]); Тут условия, вот только я так и не понял, в каком случае в контексте кода тут может быть TRUE PHP: $mask = (long2ip($x) == $ip_arr[1]) ? $x : 0xffffffff << (32 - $ip_arr [1]); А вот это я не понял, как оно работает: PHP: 0xffffffff << (32 - $ip_arr [1]) тут я так понял мне нужно разобраться как работают битовые операторы: PHP: return ( $ip_long & $mask ) == ( $network_long & $mask ); Но суть такова, что будет либо true / либо false
PHP: 0xffffffff << (32 - $ip_arr [1]) Тут происходит побитовый сдвиг влево, количество сдвигаемых бит как раз является (32 - $ip_arr [1])
Но я не могу до конца понято что происходит вот тут: PHP: return($ip_long&$mask)==($network_long&$mask); mask >1111111111111111111111111111111100 network_long >11010100011000101010000000000000 ip_long >11010100011000101010000000000010
Попадание в диапазон – это совпадение старших частей IP-адресов (тестируемого IP-адреса и базы диапазона/адреса сети), находящихся «под маской». Операция & обнуляет мл. части, чтобы их неравенство не мешало сравнению старших частей. В принципе к базе диапазона применять & не обязательно, если она корректна.