Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中将16位Int转换为IP地址_Php_Bit Manipulation - Fatal编程技术网

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

在PHP中将16位Int转换为IP地址,php,bit-manipulation,Php,Bit Manipulation,我得到了下面的PHP函数,并被要求编写另一个函数来反转它 function convertTo16bit($ipString) { $ipString = explode(".", $ipString); $ip = ($ipString[0] << 24) | ($ipString[1] << 16) | ($ipString[2] << 8) | ($ipString[3]); $lowNumber = $ip & 0xf

我得到了下面的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 );
}
函数转换为16位($ipString){
$ipString=explode(“.”,$ipString);

$ip=($ipString[0]您不必自己编写这些函数。您可以使用
ip2long()
long2ip()

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

由于PHP的整数类型是有符号的,并且许多IP地址将在32位体系结构上产生负整数,因此需要使用sprintf()或printf()的“%u”格式化程序来获取无符号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;
   }
函数转换16位到IP($startingArray){
$low=$startingArray[0];
$high=$startingArray[1];
$base=$high>24&0x00ff;
$ip2=$base>>16&0x00ff;
$ip3=$base>>8&0x00ff;
$ip4=$base&0x00ff;
$ip=“$ip1.$ip2.$ip3.$ip4”;
返回$ip;
}

Hm,也许您可以简单地使用
long2ip()
ip2long()
函数。当我看到这个问题时,我最初的想法是两个PHP函数…和?我认为以
$ip=
开头的行应该以
$ipString=
开头,这样函数才能工作。什么?为什么?我可以根据自己的想法命名变量。@DmytroZarezenko:
$ip=
在函数内部(原代码)。在函数中为该变量分配了一个值,但它没有被使用。它看起来是错误的。或者下面两行
$lowNumber=
$highNumber=
应该使用
$ip
而不是
$ipString
?抱歉,你是对的。我更改了原始函数是的,我可以使用ip2long和long2ip但练习的重点是理解PHP中的逐位运算。