Почему правый сдвиг в PHP возвращает отрицательное число?


Я пытаюсь запросить трекер bittorrent и использую unpack, чтобы получить список IP-адресов из ответа. Итак, что-то вроде этого:

$ip = unpack("N", $peers);
$ip_add = ($ip[1]>>24) . "." . (($ip[1]&0x00FF0000)>>16) . "." . (($ip[1]&0x0000FF00)>>8) . "." . ($ip[1]&0x000000FF);

Но по какой-то причине я получаю следующие IP-адреса при печати $ip_add:

117.254.136.66
121.219.20.250
-43.7.52.163

Кто-нибудь знает, что может пойти не так?

Author: Charles, 2010-04-16

3 answers

Используйте long2ip() для преобразования номера обратно в ip

 10
Author: zerkms, 2010-04-16 04:07:03

Как говорит зеркмс, long2ip делает то, что вы хотите. Чтобы ответить на ваш вопрос, >> является арифметическим сдвигом вправо (названным так, потому что $i >> $j эквивалентно арифметическому выражению i / 2j), которое распространяет знаковый бит, чтобы сохранить знак числа. То есть, $i < 0 если ($i >> $j) < 0. PHP не имеет логического сдвига (но вы могли бы определить свой собственный).

 5
Author: outis, 2017-05-23 10:27:35

Попробуйте это

function decode_ip($str){
    $str = (float)($str);
    $ip = array(
        (int)($str/pow(2,24)),
        (int)($str/pow(2,16) & 0xFF),
        (int)($str/pow(2,8) & 0xFF),
        (int)($str & 0xFF)
    );
    return join(".", $ip);
}

decode_ip("3225422716"); //192.64.11.124

 1
Author: Vitim.us, 2013-08-16 22:44:01