在PHP中将16位Int转换为IP地址

时间:2012-08-23 09:10:40

标签: php bit-manipulation

我已经获得了以下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地址的形式返回一个字符串。有人能指出我正确的方向吗?

由于

3 个答案:

答案 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;
   }