Почему правый сдвиг в 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
Кто-нибудь знает, что может пойти не так?
5
3 answers
Как говорит зеркмс, 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