2010-04-16 1 views
5

Я пытаюсь запросить bittorrent трекер и использую распаковку, чтобы получить список IP-адресов из ответа. Так, что-то вроде этого:Почему сдвиг вправо в PHP возвращает отрицательное число?

$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 

Кто-нибудь знает, что может быть неправильно?

ответ

10

использование long2ip() преобразовать число обратно в ф

+0

Вы спаситель! Большое спасибо. Не может принять ответ в течение 10 минут после публикации:) В любом случае, не могли бы вы рассказать мне, что не так с моим методом? – Legend

+0

вы должны добавить 2^31 в $ ip перед вычислениями ($ ip + pow (2, 31)) – zerkms

+0

или $ ip & 0x7FFFFFFF; – zerkms

5

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

+0

Я вижу ... Понял. Спасибо за объяснение. Пройдет через информацию, которую вы предоставили. +1 Цените это. – Legend

0

Попробуйте

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

Смежные вопросы