我得到了下面的PHP函数,并被要求编写另一个函数来反转它
function convertTo16bit($ipString) {
$ipString = explode(".", $ipString);
$ip = ($ipString[0] << 24) | ($ipString[1] << 16) | ($ipString[2] << 8) | ($ipString[3]);
$lowNumber = $ip & 0xffff;
$highNumber = ($ip >> 16) & 0xffff;
return array($lowNumber , $highNumber );
}
第一个问题:我理解上面的代码在做什么,但不知道为什么,有人能解释一下为什么你需要创建一个lowNumber和highNumber吗?
其次,我需要编写一个名为"convertToIPAddress"的函数,该函数采用与上面输出的数组类似的数组,并以IP地址的形式返回字符串。有人能给我指正确的方向吗?
感谢
您不必自己编写这些函数。为此,可以使用ip2long()
和long2ip()
。
上下部分的原因是在32位系统(甚至64位Windows)上,整数不足以容纳所有可能的值。上面提到的PHP函数通过返回具有相同位集的负数来"解决"这个问题。
由于PHP的整数类型是有符号的,并且许多IP地址在32位体系结构上会导致负整数,因此需要使用sprintf()或printf()的"%u"格式化程序来获得无符号IP地址的字符串表示。(来源:http://php.net/ip2long)
我写了这样的代码:
<?php
function convertTo16bit($ipString) {
$ipString = explode(".", $ipString);
$ip = ($ipString[0] << 24) | ($ipString[1] << 16) | ($ipString[2] << 8) | ($ipString[3]);
$lowNumber = $ipString & 0xffff;
$highNumber = ($ipString >> 16) & 0xffff;
return array($lowNumber , $highNumber );
}
$ip = "192.168.1.17";
var_dump($ip);
var_dump(convertTo16bit($ip));
?>
收到:
string '192.168.1.17' (length=12)
array (size=2)
0 => int 1
1 => int 0
我认为这个函数不正确。不要使用它。
我想明白了。。。
function convert16BitIntsToIP($startingArray) {
$low = $startingArray[0];
$high = $startingArray[1];
$base = $high << 16 | $low;
$ip1 = $base >> 24 & 0x00ff;
$ip2 = $base >> 16 & 0x00ff;
$ip3 = $base >> 8 & 0x00ff;
$ip4 = $base & 0x00ff;
$ip = "$ip1.$ip2.$ip3.$ip4";
return $ip;
}