什么是 Base64 编码?
Base64
它是一种用64
个字符来表示任意二进制数据的方法。
Base64 编码的原理很简单,首先,准备一个包含64个字符:
然后,对二进制数据进行处理,每3
个字节一组,一共是 3x8=24 bit
,划为4
组,每组正好 6
个bit
,这样我们得到 4
个数字作为索引,然后查表,获得相应的4
个字符,就是编码后的字符串。
如果要编码的二进制数据不是3
的倍数,最后会剩下1
个或2
个字节怎么办?Base64
会用 \x00
字节在末尾补足后,再在编码的末尾加上1
个或2
个=
号,表示补了多少字节,解码的时候,会自动去掉。
下图展示了原字符串 hello
转换为 Base64 编码过程。
在 "Base64编码后字符" 的阶段,最后一个字符 000000
正常应该转换为 A
的,不过由于最后一个字符是补充上去的,所以不会转换为 A
,而是使用对应数量的 =
补充。
URL 安全的 Base64 编码
由于标准的 Base64
编码之后可能出现字符 +
和 /
,这样在 URL
中就不能直接作为参数,所以 URL
安全的 Base64
编码,需要把字符 +
和 /
分别变成 -
和 _
,另外 =
字符也可能出现在 Base64
编码中,但 =
用在 URL
和 Cookie
里面会造成歧义,所以,很多 URL
安全的 Base64
编码也会把 =
去掉。
URL 安全的 Base64 编码:
- 对数据进行
base64
编码; - 将
base64
编码后的字符串中的+
和/
替换为-
和_
; - 再取出字符串尾部的
=
。
php
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
URL 安全的 Base64 解码:
- 先给要解码的字符串尾部补充
=
; - 再将
-
和_
替换为+
和/
; - 最后进行
base64
解码。
php
function base64url_decode( $data ){
return base64_decode( strtr( $data, '-_', '+/') . str_repeat('=', 4 - strlen( $data ) % 4 ));
}