将二进制字符串转换为十进制时出现错误结果


Wrong results when converting binary strings to decimal

我编写了以下函数将二进制格式的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));
}