我已经获得了以下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地址的形式返回一个字符串。有人能指出我正确的方向吗?
由于
答案 0 :(得分:2)
您不必自己编写这些功能。您可以使用ip2long()
和long2ip()
来实现此目的。
上部和下部的原因是在32位系统(甚至是64位Windows)上,整数不足以容纳所有可能的值。上面提到的PHP函数通过返回具有相同位设置的负数来“解决”。
因为PHP的整数类型是有符号的,并且许多IP地址将在32位体系结构上产生负整数,所以需要使用sprintf()或printf()的“%u”格式化程序来获取字符串表示形式。未签名的IP地址。 (来源:http://php.net/ip2long)
答案 1 :(得分:1)
我写了这段代码:
<?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
我觉得这个功能不正确。不要使用它。
答案 2 :(得分: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;
}