2010-04-16 14 views
5

Estoy tratando de consultar un rastreador bittorrent y estoy usando desempaquetar para obtener la lista de direcciones IP de la respuesta. Por lo tanto, algo como esto:¿Por qué el desplazamiento a la derecha en PHP devuelve un número negativo?

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

Pero, por alguna razón, me estoy haciendo las siguientes direcciones IP cuando imprimo $ ip_add:

117.254.136.66 
121.219.20.250 
-43.7.52.163 

¿Alguien sabe lo que podría ir mal?

Respuesta

10

uso long2ip() para transformar de nuevo en número IP

+0

Usted es un salvador! Muchas gracias. No puedo aceptar como respuesta dentro de los 10 minutos posteriores a la publicación:) En cualquier caso, ¿podría decirme qué sucedía con mi método? – Legend

+0

tiene que agregar 2^31 a $ ip antes de los cálculos ($ ip + pow (2, 31)) – zerkms

+0

o $ ip & 0x7FFFFFFF; – zerkms

5

Como dice zerkms, long2ip hace lo que quiere. Para responder a su pregunta, >> es un cambio a la derecha arithmetic (llamado así porque $i >> $j es equivalente a la expresión aritmética i/2j), que propaga el bit de signo para conservar el signo del número. Es decir, $i < 0iff($i >> $j) < 0. PHP no tiene un logical shift (pero podría define your own).

+0

Ya veo ... Entendido. Gracias por la explicación. Examinará la información que ha proporcionado. +1 lo aprecio. – Legend

0

probar este

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

Cuestiones relacionadas