Base64 是一种数据编码方案,用于安全的数据传输,例如 HTTP 及其扩展。Base64 编码可以将任意字节组转换为可读的 ASCII 字符序列。这些转换后的字符可以安全地放入 HTTP 标头中,而不会在对等方处理 HTTP 标头时引起任何问题。
Base64 编码是作为 MIME 内容传输编码的一部分发明的。它类似于其他编码方案,例如 Uuencode 和 BinHex,但效率更高。
8 位到 6 位
Base64 会将字节分成 6 位的组。每 6 位将映射到一个字符。该字符将是 Base64 字符表中的 64 个字符之一。这 64 个字符是通用的,可以安全地放入 HTTP 标头中。这些字符包括 a-z、A-Z、0-9、+、/ 和一个特殊用途字符 =(第 65 个字符)。
由于 Base64 将使用一个字符来表示 6 位数据,因此 Base64 编码数据的大小将比原始数据大 33%。
下面是一个简单的 Base64 工作原理示例。假设有三个字符“Ow!”要进行 Base64 编码。
- 字符“Ow!”将转换为三个 8 位字节 (0x4F, 0x77, 0x21)
- 这 3 个字节将转换为 24 位 (01001111 01110111 00100001)
- 这 24 位将分为 6 位的组 (010011、110111、011100、1000001)。
- 每 6 位将是一个介于 0 和 63 之间的值,它将映射到上面的 64 个字符之一。编码后的最终结果是“T3ch”。
Base64 填充
Base64 将采用字节序列并将其分为 6 位的组。有时不可能将序列分成精确的 6 位组数。在这种情况下,将在序列中填充 0,使其成为精确的 24 位组数(6 和 8 的最小公倍数)。此过程称为填充。
在编码填充数据时,如果存在完全填充的 6 位组(组中的每一位都已填充,不包含来自原始数据的任何位),则它将映射到“=”。
以下是一些填充工作原理的示例:
-
a:a -- 011000 010011 101001 100001 -- YTph
-
a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==
-
a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=
-
a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh
需要填充到 24 位而不是 6 位的原因是,它确保如果两个 Based64 编码的序列连接然后解码,则解码后的数据与原始数据相同。
例如,如果我们编码两个字符串“a.aa”和“a.aa”,如果我们只填充到 6 位,那么“a.aa”的编码字符串将是 011000 010011 101001 100001 011000 010000。现在,如果这两个编码字符串连接在一起,它将变成 010011 101001 100001 011000 010000 010011 101001 100001 011000 010000。如果解码此字符串,结果将是“01001110 10011000 01011000 01000001 00111010 01100001 01100001 0000”,并且无法正确解码。
Simple and neat! thanks