要快速记忆 Base64 的编码和解码规则,抓住核心要点和一些小窍门非常有效。
Base64 快速记忆法
记住这几个核心点和口诀:
“三变四,不足补等号” (核心口诀)
三变四: Base64 的本质是把每 3 个原始字节(8位3 = 24位数据)转换成4 个 Base64 字符(6位4 = 24位数据)。
为什么要 3 变 4?因为 24 是 8 (字节) 和 6 (Base64编码单位) 的最小公倍数。
不足补等号: 如果原始数据不是 3 个字节的倍数:
剩 2 个字节: 编码后最后会补 1 个 =。 (例如:Ma -> TWE=)
剩 1 个字节: 编码后最后会补 2 个 。 (例如:M -> TQA)
字符集规律:
大写字母 A-Z: 对应 0-25
小写字母 a-z: 对应 26-51
数字 0-9: 对应 52-61
特殊字符: + 对应 62,/ 对应 63。
记忆: 就是 A-Z, a-z, 0-9,然后 + 和 / 在最后。这 64 个字符都是可打印的 ASCII 字符,保证了在文本环境中传输不会乱码。
编码过程的脑海模拟:
想象你拿到几个字符:
先把它们变成二进制(ASCII)。
把所有二进制位连起来。
然后每 6 位切一刀。
每一小段 6 位二进制,查表变成一个 Base64 字符。
最后看看有没有多余的二进制位(因为不是 3 的倍数),根据剩下 1 位还是 2 位决定补几个 =。
解码过程的脑海模拟(逆向思维):
拿到 Base64 字符串。
忽略 =。
把每个 Base64 字符查表变回 6 位二进制。
把所有 6 位二进制连起来。
然后每 8 位切一刀。
每一小段 8 位二进制,查表变回一个 ASCII 字符。
为什么这样设计?
避免乱码: 在早期计算机系统和网络传输中,很多协议和系统只支持或推荐使用特定的“可打印 ASCII 字符”。二进制数据直接传输可能会被错误解释或导致乱码。Base64 将所有二进制数据转换成这种安全的字符集。
效率与兼容性: 选择 6 位作为一个编码单元,是因为 2^6 = 64,刚好可以用 64 种字符表示,既能覆盖所有可能性,又能比较高效地利用空间。而 3 字节 (24位) 转换成 4 字符 (24位) 则是为了能整除,保证数据不丢失。
通过抓住“三变四,不足补等号”这个核心,以及理解其将二进制转换为安全文本的目的,你就能在脑海中快速构建 Base64 的工作原理,而无需记住所有细节。在实际使用中,总是会用到现成的库来执行编码和解码,但理解其原理会在处理各种编码问题(特别是在网络安全分析中遇到混淆数据时)时更有底气。
另外补充:
关于 = 或 == 在解码时的工作原理:
当你看到 Base64 编码字符串中的 = 或 == 时:
1. **解码器会识别它们作为填充符,但不会将它们本身转换成二进制位。**
* 它们的存在只意味着原始数据长度不是 3 的倍数。
* Base64 字符表是不包含 `=` 的,所以它没有对应的 6 位二进制值。
2. **根据 `=` 的数量,确定要丢弃的末尾填充位。**
* **如果末尾是 `==` (两个等号):**
* 这意味着编码前的原始数据**只有 1 个字节**。
* 在编码时,为了凑齐 24 位,在原始的 8 位后面补了 **16 个 `0`**。
* 解码器看到 `==` 后,会**丢弃最后 16 个位**(或最后两个 6 位组所代表的二进制位),只保留最前面的 8 位,然后将其转换成原始的 1 个字节。
* **如果末尾是 `=` (一个等号):**
* 这意味着编码前的原始数据**只有 2 个字节**。
* 在编码时,为了凑齐 24 位,在原始的 16 位后面补了 **8 个 `0`**。
* 解码器看到 `=` 后,会**丢弃最后 8 个位**(或最后一个 6 位组所代表的二进制位),只保留最前面的 16 位,然后将其转换成原始的 2 个字节。
* **如果没有 `=`:**
* 这意味着原始数据长度正好是 3 的倍数,编码时没有补 `0`,解码时也不需要丢弃任何位,直接每 8 位还原。
**简单来说,`=` 的作用不是提供数据,而是提供一个“修剪指令”:**
* **`==` 告诉我:** 我是 4 个 Base64 字符组的最后两个字符,但它们代表的 12 位都是没用的,我前面只有 1 个字节的数据是真实的。
* **`=` 告诉我:** 我是 4 个 Base64 字符组的最后一个字符,但我代表的 6 位是没用的,我前面只有 2 个字节的数据是真实的。
**解码过程中的关键点是:**
1. 把 Base64 字符串(不包括填充符 `=`)转换成连续的 6 位二进制序列。
2. 然后,根据末尾的 `=` 数量来**决定从这个二进制序列的末尾移除多少位**。
* 有 `==` 就移除末尾的 16 位。
* 有 `=` 就移除末尾的 8 位。
3. 最后,将修剪后的二进制序列**每 8 位一组**,还原成原始的字节数据。
这样,你就不需要考虑 `=` 本身如何“还原”,而是把它看作一个信号,指导你如何正确地切割和解释二进制位流。
感谢浏览和学习,作者:鱼油YOU,转载请注明原文链接:https://www.cnblogs.com/OmegaYOU3/p/18950852,或者可以➕主播WX:OmegaAnimeman_desu;QQ:3819054512
浙公网安备 33010602011771号