Why does right shift in PHP return a negative number?
I am trying to query a bittorrent tracker and am using unpack to get the list of IPs from the response. So, something like this:
$ip = unpack("N", $peers);
$ip_add = ($ip[1]>>24) . "." . (($ip[1]&0x00FF0000)>>16) . "." . (($ip[1]&0x0000FF00)>>8) . "." . ($ip[1]&0x000000FF);
But, for some reason, I am getting the following IP开发者_开发问答 addresses when I print $ip_add:
117.254.136.66
121.219.20.250
-43.7.52.163
Does anyone know what could be going wrong?
use long2ip() to transform number back into ip
As zerkms says, long2ip
does what you want. To answer your question, >>
is an arithmetic right shift (so named because $i >> $j
is equivalent to the arithmetic expression i / 2j
), which propagates the sign bit to preserve the sign of the number. That is, $i < 0
iff ($i >> $j) < 0
. PHP doesn't have a logical shift (but you could define your own).
Try this
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
精彩评论