二进制数据在PHP中不由1和0表示

时间:2018-01-08 08:04:14

标签: php binary

我们假设以下十六进制字符串:c3b5394f6ea32eb9339ab3f9dd971f85。使用函数hex2bin我收到一个错误,即十六进制字符串必须是偶数长度,所以首先,为什么会这样?

其次,即使我删除了最后一个字符,而不是接收由0和1表示的二进制,我还是这些字符:��(sl˥�m��。如何将其转换为0和1?为什么我不能将奇数长度的十六进制字符串转换为二进制?

1 个答案:

答案 0 :(得分:3)

您尝试做的事情有一些问题。

首先,根据hex2binhttp://php.net/manual/en/function.hex2bin.php)...

的手册
  

注意此函数不会将十六进制数转换为a   二进制数。这可以使用base_convert()函数完成。

所以你试图将它用于它没有做的事情 - 不可否认,我认为这可能被视为PHP中一个糟糕的命名约定。没有什么新东西。

其次 - 这是期望将字符串转换为数字和十六进制字符串' c3b5394f6ea32eb9339ab3f9dd971f85'有多个数字可以表示为数值(考虑每个char给出4位值)。

按照手册中的提示,如果你使用一些较小的例子 - 这就是你可以得到的......

echo  hex2bin('71f8').PHP_EOL;
echo base_convert ('71f8' , 16 , 2 ).PHP_EOL;
echo decbin(12);

...给出

q�
111000111111000
1100

至于必须拥有偶数个字符。由于大多数系统使用2个十六进制字符来表示单个ascii字符,这意味着它不能使用奇数字符来进行转换,因此它会发出警告并忽略最后一个字符。

更新

要转换大数字,您可以编写一个简单的函数来一次转换每个char并将结果构建为字符串......

function strToBin ( $number )    {
    $result = '';
    for ( $i = 0; $i < strlen($number); $i++ ){
        $conv = base_convert($number[$i], 16, 2);
        $result .= str_pad($conv, 4, '0', STR_PAD_LEFT);
    }
    return $result;
}
echo strToBin('d288a775eba4132a982701fa625c9b820').PHP_EOL;
echo '110100101000100010100111011101011110101110100100000100110010101010011000001001110000000111111010011000100101110010011011100000100000';

(第二个输出是使用您指示的转换页面检查结果是否正常的结果。)

...输出

110100101000100010100111011101011110101110100100000100110010101010011000001001110000000111111010011000100101110010011011100000100000
110100101000100010100111011101011110101110100100000100110010101010011000001001110000000111111010011000100101110010011011100000100000