我们假设以下十六进制字符串:c3b5394f6ea32eb9339ab3f9dd971f85
。使用函数hex2bin
我收到一个错误,即十六进制字符串必须是偶数长度,所以首先,为什么会这样?
其次,即使我删除了最后一个字符,而不是接收由0和1表示的二进制,我还是这些字符:��(sl˥�m��
。如何将其转换为0和1?为什么我不能将奇数长度的十六进制字符串转换为二进制?
答案 0 :(得分:3)
您尝试做的事情有一些问题。
首先,根据hex2bin
(http://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