为什么PHP中的右移会返回负数?

时间:2010-04-16 04:04:27

标签: php ip-address bitwise-operators

我正在尝试查询bittorrent跟踪器,并使用unpack从响应中获取IP列表。所以,像这样:

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

但是,出于某种原因,我在打印$ ip_add时收到以下IP地址:

117.254.136.66
121.219.20.250
-43.7.52.163

有谁知道会出现什么问题?

3 个答案:

答案 0 :(得分:10)

使用long2ip()将数字转换回ip

答案 1 :(得分:5)

正如zerkms所说,long2ip做你想做的事。要回答您的问题,>>arithmetic右移(因为$i >> $j等同于算术表达式i / 2j而命名),它传播符号位以保留符号数量。也就是说,$i < 0 iff ($i >> $j) < 0。 PHP没有logical shift(但您可以define your own)。

答案 2 :(得分:1)

试试这个

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