为什么base64_encode()在结果中添加斜杠“/”?

时间:2012-07-12 10:08:53

标签: php encoding base64

我正在编写应用程序的URL后缀:

$url = 'subjects?_d=1';
echo base64_encode($url);

// Outputs
c3ViamVjdHM/X2Q9MQ==

注意'X2'之前的斜杠。

为什么会这样?我认为base64只输出A-Z,0-9和'='作为填充?我已经尝试使用在线base64编码器来检查,似乎base64总是这样做。我不知道它是下划线“_”还是问号“?”或者“=”或许?

8 个答案:

答案 0 :(得分:77)

没有。 Base64字母表包括A-Z,a-z,0-9和+以及/

如果您不关心其他应用程序的可移植性,则可以替换它们。

请参阅:http://en.wikipedia.org/wiki/Base64#Variants_summary_table

您可以使用类似的内容来代替使用您自己的符号(将-_替换为您想要的任何内容,只要它不在base64基本字母表中,当然!)。

以下示例将普通base64转换为base64url as specified in RFC 4648

function base64url_encode($s) {
    return str_replace(array('+', '/'), array('-', '_'), base64_encode($s));
}

function base64url_decode($s) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $s));
}

答案 1 :(得分:9)

除了上面的所有答案,指出/是预期的base64字母表的一部分,应该注意你在编码字符串中看到/的特殊原因是因为当base64编码ASCII文本时,生成一个/的唯一方法是将一个问号放在可被三整除的位置。

答案 2 :(得分:6)

抱歉,你错了。 A-Za-z0-9只能获得62个字符。 Base64使用另外两个字符,在PHP的情况下为/+

答案 3 :(得分:4)

没有什么特别之处。

基础64“字母”或“数字”是A-Z,a-z,0-9加上两个额外字符+(加号)和/(斜线)。

如果需要,您可以稍后使用%2f进行编码。

答案 4 :(得分:3)

A-Z是26个字符。 0-9是10个字符。 =是一个字符。这总共提供了37个字符,比64字符短。

/是64个字符中的一个。您可以在the wikipedia page上看到完整列表。

答案 5 :(得分:2)

对于base64,有效的字符集是: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

=用作最后一个字节的填充

微米。

答案 6 :(得分:2)

没有直接关系,上面有足够的人已经很好地回答和解释了解决方案。

但是,有点超出范围。如果您想要可读的基本文字,请尝试查看 Base58 。如果你只想要字母数字字符,那值得考虑。

答案 7 :(得分:0)

希望对您有帮助

public function generate_key($s) {
    return str_replace(array('+', '/'), array('-', '_'), base64_encode($s));
}
$randomKey = generate_key(openssl_random_pseudo_bytes(12)); //you can change this number for different length of keys in base64 format

您可以通过以下功能解码以上密钥。只需在此处传递您的加密字符串

function key_decode($s) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $s));
}

不需要解码openssl_random_pseudo_bytes(),但是您可以将其用于其他情况,例如解码url ...