2010-04-16 14 views
5

मैं एक बिटटोरेंट ट्रैकर क्वेरी करने के लिए कोशिश कर रहा हूँ और प्रतिक्रिया से आईपी की सूची प्राप्त करने खोल उपयोग कर रहा हूँ। तो, कुछ इस तरह: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 जोड़ने के लिए ($ आईपी + पॉव (2, 31)) – zerkms

+0

या $ आईपी और 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

संबंधित मुद्दे