base64是取3个字节(24位)的数据强行组成4个字节(32位)的数据做为一个分组,24位分成4个字节的话,每个字节分到6位,然后前面补两位0,然后这个字节的值位索引去base64表找值。
1. 因为前面补两个0,那么只有6位来算索引,最长就是2^6=64,所以base64表只有64个。
2. 因为每4个字节一个分组,所以base64后的长度肯定是4的倍数。
3. 因为不是所有的字符串都能被3整除,所以存在不够的情况,那么就在后面补了=号。
4. 因为很多URL中包含了+ / =字符,做http传输的时候URL编码会把这三个字符编码掉,所以URL安全的处理是把+换成-,把/换成_,把=去掉。
所以URL安全的base64在encode后会这样处理:
string_replace(data, "+", "-");
string_replace(data, "/", "_");
string_replace(data, "=", "");
URL安全的base64首先会这样处理在decode:
string_replace(data, "-", "+");
string_replace(data, "_", "/");
int mod4 = data.size()%4;
if (mod4 > 0)
{
int num = 4 - mod4;
data.append(num, '=');
}