在PHP中,未用1和0表示的二进制数据

5
假设有以下十六进制字符串:c3b5394f6ea32eb9339ab3f9dd971f85。使用函数hex2bin时,我收到一个错误,说这个十六进制字符串的长度必须是偶数,那么首先为什么呢?
其次,即使我去掉最后一个字符,我也没有收到由0和1表示的二进制,而是这些字符:��(sl˥�m��。如何将它转换为0和1?为什么不能将奇数长度的十六进制字符串转换为二进制?

请提供您用于生成此输出的代码示例。我们无法调试我们没有的代码。 - Michael Thompson
那些字符,正如你所说,是十六进制数据的二进制表示。这就是输出结果。你为什么期望看到0和1呢? - Andrei
代码示例:echo hex2bin('c3b5394f6ea32eb9339ab3f9dd971f8');。二进制不是最终都是由一和零组成吗?为什么当我将十进制数转换为二进制时,我得到的却是一些数字?(例如 echo decbin(12); - user2298995
1个回答

9

你所尝试的方法存在一些问题。

首先,根据hex2bin手册(http://php.net/manual/en/function.hex2bin.php) ...

注意:该函数无法将十六进制数转换为二进制数。可以使用base_convert()函数进行转换。

因此,你正在尝试使用它来完成它无法完成的任务 - 我认为这可能被视为PHP中的不良命名惯例。没有新东西。

其次,这个函数期望将字符串转换为数字,而一个由'c3b5394f6ea32eb9339ab3f9dd971f85'组成的十六进制字符串具有太多位数,无法表示为数值(考虑到每个字符给出4位值)。

按照手册中的提示,如果使用一些较小的示例,则可以获得以下结果...

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

给出...

q�
111000111111000
1100

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

更新:

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

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

感谢您的回复。我最终想要实现如此二进制结果:https://www.rapidtables.com/convert/number/hex-to-binary.html,从给定的奇数十六进制字符串,例如 d288a775eba4132a982701fa625c9b820 - user2298995
1
我已经添加了一个转换函数,可能会有所帮助。 - Nigel Ren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接