我编写了以下函数将二进制格式的IP地址转换为十进制点表示法:
function bin_to_ddn($binary_ip) #converts a binary IP in DDN
{
$binary_ip_arr = str_split($binary_ip,8); #convert binary IP to array
foreach($binary_ip_arr as &$value) { #convert each octet to decimal
$value = bindec($value);
}
$ddn = implode('.',$binary_ip_arr); #convert to string
return $ddn;
}
问题是这个函数适用于某些数字,而不适用于其他数字。例如:
11000111000000010000000101100000
成为
199.1.1.96
但
11000111000000010000000101111111
成为
199.1.1.127.0
出于某种原因,它在末尾添加一个额外的八位字节。知道这个函数可能有什么问题吗?
您的字符串很可能包含尾随空格。请考虑以下测试:
echo bin_to_ddn("11000111000000010000000101111111 ");
>>> 199.1.1.127.0
echo bin_to_ddn("11000111000000010000000101111111");
>>> 199.1.1.127
我建议修剪输入:
$binary_ip_arr = str_split(trim($binary_ip),8);
如果这是用户生成的输入,则可能需要添加更多输入验证。
刚刚实现了您的代码 - 工作完美,但进行了一些修改,也许它会以某种方式提供帮助:
function bin_to_ddn($binary_ip) #converts a binary IP in DDN
{
$binary_ip_arr = str_split($binary_ip,8); #convert binary IP to array
$dec_arr = array();
foreach($binary_ip_arr as $value) { #convert each octet to decimal
$dec_arr[] = bindec($value);
}
$ddn = implode('.',$dec_arr); #convert to string
return $ddn;
}
echo bin_to_ddn('11000111000000010000000101100000');
echo bin_to_ddn('11000111000000010000000101111111');
有内置函数可以执行以下操作:
echo long2ip(bindec('11000111000000010000000101111111'));
或者在函数中:
function bin_to_ddn($binary_ip) #converts a binary IP in DDN
{
return long2ip(bindec((string)$binary_ip));
}