Почему сдвиг вправо в PHP возвращает отрицательное число? - PullRequest
5 голосов
/ 16 апреля 2010

Я пытаюсь запросить bittorrent-трекер и использую распаковку, чтобы получить список 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

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

Ответы [ 3 ]

10 голосов
/ 16 апреля 2010

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

5 голосов
/ 16 апреля 2010

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

1 голос
/ 17 августа 2013

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

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

...