1

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

谢谢

4

3 回答 3

2

您不必自己编写这些函数。你可以使用ip2long()andlong2ip()来达到这个目的。

上下部分的原因是在 32 位系统(甚至 64 位 Windows)上,整数不足以容纳所有可能的值。上面提到的 PHP 函数通过返回具有相同位设置的负数来“解决”这个问题。

因为 PHP 的整数类型是有符号的,而且很多 IP 地址在 32 位架构上会产生负整数,所以需要使用 sprintf() 或 printf() 的 "%u" 格式化程序来获取无符号 IP 地址的字符串表示. (来源: http: //php.net/ip2long

于 2012-08-23T09:16:06.843 回答
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

我认为这个功能是不正确的。不要使用它。

于 2012-08-23T09:18:34.760 回答
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;
   }
于 2012-09-11T22:31:28.917 回答