2010-04-16 15 views
5

Ich versuche, einen BitTorrent-Tracker abzufragen und benutze Entpacken, um die Liste der IPs aus der Antwort zu erhalten. So etwas wie folgt aus:Warum gibt eine Rechtsverschiebung in PHP eine negative Zahl zurück?

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

Aber aus irgendeinem Grund, erhalte ich die Adressen folgende IP, wenn ich $ ip_add drucken:

117.254.136.66 
121.219.20.250 
-43.7.52.163 

Wer weiß, was falsch sein könnte gehen?

Antwort

10

Verwendung long2ip() Zahl umwandeln zurück in ip

+0

Sie sind ein Retter! Danke vielmals. Kann nicht als Antwort innerhalb von 10 Minuten nach der Veröffentlichung akzeptieren:) Könnten Sie mir auf jeden Fall sagen, was mit meiner Methode nicht in Ordnung war? – Legend

+0

müssen Sie vor den Berechnungen 2^31 zu $ ​​ip hinzufügen ($ ip + pow (2, 31)) – zerkms

+0

oder $ ip & 0x7FFFFFFF; – zerkms

5

Wie zerkms sagt, long2ip tut, was Sie wollen. Um Ihre Frage zu beantworten, >> ist eine arithmetic Rechtsverschiebung (so benannt, weil $i >> $j entspricht dem arithmetischen Ausdruck i/2j), die das Vorzeichen Bit propagiert, um das Vorzeichen der Zahl zu erhalten. Das heißt $i < 0iff($i >> $j) < 0. PHP hat keine logical shift (aber Sie könnten define your own).

+0

Ich verstehe ... verstanden. Danke für die Erklärung. Durchläuft die von Ihnen bereitgestellten Informationen. +1 Schätze es. – Legend

0

Versuchen Sie, diese

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

Verwandte Themen