2010-04-16 57 views
5

我想查询一个bittorrent跟踪器,并使用unpack从响应中获取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()改造号回IP

+0

你是救世主!非常感谢。在发布10分钟内不能接受答案:)无论如何,你能告诉我我的方法出了什么问题吗? – Legend 2010-04-16 04:08:45

+0

在计算之前($ ip + pow(2,31)) – zerkms 2010-04-16 04:15:38

+0

或$ ip&0x7FFFFFFF,您必须添加2^31到$ ip; – zerkms 2010-04-16 04:18:23

5

由于zerkms说,long2ip你想要做什么。要回答你的问题,>>arithmetic右移(因为$i >> $j等于算术表达式i/2j),因此传播符号位以保留数字的符号。那就是,$i < 0iff($i >> $j) < 0。 PHP没有logical shift(但你可以define your own)。

+0

我明白了...明白了。感谢您的解释。将浏览你提供的信息。 +1欣赏它。 – Legend 2010-04-16 04:12:46

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

相关问题