2010-04-16 6 views
5

Sto cercando di interrogare un bittorrent tracker e sto usando unpack per ottenere l'elenco degli IP dalla risposta. Quindi, qualcosa di simile:Perché il passaggio a destra in PHP restituisce un numero negativo?

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

Ma, per qualche motivo, sto ottenendo i seguenti indirizzi IP quando stampo $ ip_add:

117.254.136.66 
121.219.20.250 
-43.7.52.163 

Qualcuno sa che cosa potrebbe andare male?

risposta

10

uso long2ip() per trasformare il numero di nuovo in ip

+0

Sei un salvatore! Molte grazie. Non posso accettare come risposta entro 10 minuti dalla pubblicazione:) In ogni caso, potresti dirmi cosa non ha funzionato con il mio metodo? – Legend

+0

devi aggiungere 2^31 a $ ip prima dei calcoli ($ ip + pow (2, 31)) – zerkms

+0

o $ ip & 0x7FFFFFFF; – zerkms

5

Come zerkms dice, long2ip fa ciò che si vuole. Per rispondere alla tua domanda, >> è uno spostamento a destra arithmetic (così chiamato perché $i >> $j equivale all'espressione aritmetica i/2j), che propaga il bit di segno per conservare il segno del numero. Cioè, $i < 0iff($i >> $j) < 0. PHP non ha un logical shift (ma potresti define your own).

+0

Capisco ... Capito. Grazie per la spiegazione. Passerà attraverso le informazioni che hai fornito. +1 lo apprezzo. – Legend

0

Prova questa

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

Problemi correlati