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

时间:2015-01-30 21:30:47

标签: php

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

出于某种原因,它最后添加了一个额外的八位字节。知道这个功能可能有什么问题吗?

3 个答案:

答案 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));
}