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

use*_*995 2 php binary

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

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

Nig*_*Ren 6

您尝试执行的操作存在一些问题。

首先,根据hex2binhttp://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);
Run Code Online (Sandbox Code Playgroud)

给...

q?
111000111111000
1100
Run Code Online (Sandbox Code Playgroud)

至于必须有偶数个字符。由于大多数系统使用 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';
Run Code Online (Sandbox Code Playgroud)

(第二个输出是使用您指定的转换页面来检查结果是否有效的结果。)

输出...

110100101000100010100111011101011110101110100100000100110010101010011000001001110000000111111010011000100101110010011011100000100000
110100101000100010100111011101011110101110100100000100110010101010011000001001110000000111111010011000100101110010011011100000100000
Run Code Online (Sandbox Code Playgroud)