За последние 24 часа нас посетили 21773 программиста и 1013 роботов. Сейчас ищет 691 программист ...

Помогите разобраться

Тема в разделе "PHP для новичков", создана пользователем AlexandrS, 14 июл 2019.

  1. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Нашел функцию для определения вхождения IP в заданный диапазон, она работает, но практики не хватает чтоб разобраться как она работает:


    PHP:
    1. function CheckIP(){
    2.  
    3. $ip_arr = explode ( '/' , '212.98.160.0/30' );
    4. $network_long = ip2long($ip_arr [0]);
    5.  
    6. $x = ip2long($ip_arr [1]);
    7.  
    8. $mask = (long2ip($x) == $ip_arr[1]) ? $x : 0xffffffff << (32 - $ip_arr [1]);
    9.  
    10. $ip_long = ip2long( "212.98.160.2" );
    11.  
    12. return ( $ip_long & $mask ) == ( $network_long & $mask );
    13. }
    Стал разбирать:

    Разбиваем строку диапазона на начальный IP и префикс
    PHP:
    1. $ip_arr = explode ( '/' , '212.98.160.0/30' );
    Конвертируем строку, содержащую IPv4-адрес в целое число
    PHP:
    1. $network_long = ip2long($ip_arr [0]);
    Это я не понял ибо это префикс, который является обычным числом, но не IPv4-адрес
    PHP:
    1. $x = ip2long($ip_arr [1]);
    Тут условия, вот только я так и не понял, в каком случае в контексте кода тут может быть TRUE
    PHP:
    1. $mask = (long2ip($x) == $ip_arr[1]) ? $x : 0xffffffff << (32 - $ip_arr [1]);
    А вот это я не понял, как оно работает:
    PHP:
    1. 0xffffffff << (32 - $ip_arr [1])



    тут я так понял мне нужно разобраться как работают битовые операторы:
    PHP:
    1. return ( $ip_long & $mask ) == ( $network_long & $mask );
    Но суть такова, что будет либо true / либо false
     
  2. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    PHP:
    1. 0xffffffff << (32 - $ip_arr [1])
    Тут происходит побитовый сдвиг влево, количество сдвигаемых бит как раз является (32 - $ip_arr [1])
     
  3. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Но я не могу до конца понято что происходит вот тут:
    PHP:
    1. return($ip_long&$mask)==($network_long&$mask);
    mask >1111111111111111111111111111111100
    network_long >11010100011000101010000000000000
    ip_long >11010100011000101010000000000010
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Попадание в диапазон – это совпадение старших частей IP-адресов (тестируемого IP-адреса и базы диапазона/адреса сети), находящихся «под маской». Операция & обнуляет мл. части, чтобы их неравенство не мешало сравнению старших частей. В принципе к базе диапазона применять & не обязательно, если она корректна.