将二进制数转换为Base 64

时间:2011-09-30 08:04:19

标签: php base64

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

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

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一样的函数,但是准确,最好是64位。

4 个答案:

答案 0 :(得分:3)

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

  1. 将字符串拆分为多个部分,每个部分包含8个二进制数字并描述单个字符
  2. 将每个部分转换为十进制整数
  3. 根据字符构建一个字符串,该字符串来自第二步的ASCII代码
  4. 这适用于大小为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
    

答案 1 :(得分:2)

PHP具有内置的base 64编码功能,请参阅文档here。如果你想要二进制字符串的十进制值首先使用bin2dec,顺便说一下,十六进制有类似的函数。文档是你的朋友。

[编辑]

我可能误解了你的问题,如果你想在实际基数之间转换(基数2和64),请使用base_convert

答案 2 :(得分:0)

要将二进制数(2个碱基)转换为64个碱基,请使用base_convert function

$number = 1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111;
base_convert ($number , 2, 64);

<击>

答案 3 :(得分:0)

$number = 1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111;
echo base64_encode ($number);

如果您希望将确切的字符串转换为Base 64。