将base64转换为base62(无特殊字符)

时间:2013-08-03 13:27:22

标签: php base64 converter base62

我想在一个URL中传递一个河豚加密的字符串,并希望像base64一样编码,但没有任何特殊字符,像base62这样的东西会很棒(0-9a-zA-Z)。所以我要做的是使用base64_encode转换河豚加密字符串,并将base64转换为base62。

我知道如何使base64 url​​-safe的解决方案,但我真的不希望字符串中有任何特殊字符。 convert_base()仅适用于最多36的基数,数学扩展可以转换为基数62。

有没有人知道如何使用PHP将base64字符串转换为base62?

3 个答案:

答案 0 :(得分:4)

function base62encode($data) {
    $outstring = '';
    $l = strlen($data);
    for ($i = 0; $i < $l; $i += 8) {
        $chunk = substr($data, $i, 8);
        $outlen = ceil((strlen($chunk) * 8)/6); //8bit/char in, 6bits/char out, round up
        $x = bin2hex($chunk);  //gmp won't convert from binary, so go via hex
        $w = gmp_strval(gmp_init(ltrim($x, '0'), 16), 62); //gmp doesn't like leading 0s
        $pad = str_pad($w, $outlen, '0', STR_PAD_LEFT);
        $outstring .= $pad;
    }
    return $outstring;
}

function base62decode($data) {
    $outstring = '';
    $l = strlen($data);
    for ($i = 0; $i < $l; $i += 11) {
        $chunk = substr($data, $i, 11);
        $outlen = floor((strlen($chunk) * 6)/8); //6bit/char in, 8bits/char out, round down
        $y = gmp_strval(gmp_init(ltrim($chunk, '0'), 62), 16); //gmp doesn't like leading 0s
        $pad = str_pad($y, $outlen * 2, '0', STR_PAD_LEFT); //double output length as as we're going via hex (4bits/char)
        $outstring .= pack('H*', $pad); //same as hex2bin
    }
    return $outstring;
}

$str62 = base62_encode(base64_decode($str64)) // $str64 = our string base64 encoded

所有积分均转至Marcus Bointon

答案 1 :(得分:1)

以下似乎工作正常,根本不使用base64:

gmp_strval( gmp_init( bin2hex('myencryptedstring'), 16), 62);

答案 2 :(得分:0)

如果不使用GPM,以下内容应该可以使用Base85而不会有太多麻烦。令人惊讶的是,这似乎比GPM略快,可能是因为它没有首先转到十六进制。

--