我编写了以下函数将二进制格式的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
出于某种原因,它最后添加了一个额外的八位字节。知道这个功能可能有什么问题吗?
答案 0 :(得分:2)
您的字符串很可能包含尾随空格。考虑以下测试:
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);
如果这是用户生成的输入,您可能需要添加更多输入验证。
答案 1 :(得分:1)
刚刚实现了你的代码 - 工作完美,但做了一些修改,也许它可以帮助某种方式:
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');
答案 2 :(得分:0)
有内置函数可以执行这些操作:
echo long2ip(bindec('11000111000000010000000101111111'));
或者在函数中:
function bin_to_ddn($binary_ip) #converts a binary IP in DDN
{
return long2ip(bindec((string)$binary_ip));
}