用PHP将16位Int转换为IP地址


Convert 16bit Int to IP address in PHP

我得到了下面的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;
   }