IT干货网

php之将二进制数转换为 Base 64

kevingrace 2025年05月04日 编程设计 301 0

我知道这是一个非常愚蠢的问题,但我不知道该怎么做。

我有一个任意的二进制数,比如说,

1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111 

我想使用 PHP 将它转换为 Base 64 - 我尝试的每一种方法都会给我不同的结果。甚至不同的在线转换器也会以不同的方式转换它:

http://home2.paulschou.net/tools/xlate/
http://convertxy.com/index.php/numberbases/

PHP 的 base_convert 只适用于 base36,而 base64_encode 需要一个字符串。

我该怎么办?

更新:我实现了@binaryLV建议的解决方案功能,并且效果很好。

但是,我将结果与 PHP 的内置 base_convert 进行了比较。事实证明,base_convert 到 base36 返回的值比自定义 base64 函数返回的值更短! (是的,我确实在所有二进制数字前添加了一个“1”,以确保不会丢失前导零)。

我也注意到,base_convert 对于大数字来说非常不准确。所以我需要一个像 base_convert 一样工作的函数,但准确且最好是 base 64。

请您参考如下方法:

示例中字符串的长度是 160。这让我觉得它包含大约 160/8 个字符的信息。所以,

  1. 将字符串拆分成多个部分,每个部分包含8个二进制数字并描述单个字符
  2. 将每一部分转换成十进制整数
  3. 从第 2 步的 ASCII 码生成的字符构建一个字符串

这将适用于大小为 n*8 的字符串。对于其他字符串(例如,12 个二进制数字),它会给出意想不到的结果。

代码:

function bin2base64($bin) { 
    $arr = str_split($bin, 8); 
    $str = ''; 
    foreach ( $arr as $binNumber ) { 
        $str .= chr(bindec($binNumber)); 
    } 
    return base64_encode($str); 
} 
 
$bin = '1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111'; 
echo bin2base64($bin); 

结果:

kDICQIMBEFjDBxwMBJiAASBYwgc= 

这里还有将其解码回二进制数字串的函数:

function base64bin($str) { 
    $result = ''; 
    $str = base64_decode($str); 
    $len = strlen($str); 
    for ( $n = 0; $n < $len; $n++ ) { 
        $result .= str_pad(decbin(ord($str[$n])), 8, '0', STR_PAD_LEFT); 
    } 
    return $result; 
} 
 
var_dump(base64bin(bin2base64($bin)) === $bin); 

结果:

boolean true 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!