Base64浅析
Base64浅析
目录
Base64是什么
Base64 是一种基于64个可打印字符来表示二进制数据的编码方法。它将每6个比特(bit)作为一个单元,对应码表中的一个可打印字符。根据这个规则,3个字节(24比特)的数据恰好可以由4个Base64字符来表示。
需要特别注意的是,Base64是一种编码(Encoding)方式,而不是加密(Encryption)算法,因此不具备任何保密性。
注:一个标准的ASCII字符由1个字节(8比特)表示。
为什么要使用Base64(应用场景)
你可能会问,既然会增大体积,为什么还需要Base64呢?
这是因为在网络传输中,有些协议或环境只支持传输文本字符(如ASCII字符)。当需要传输图片、音频等二进制数据时,直接传输可能会导致数据损坏或解析错误。将二进制数据编码为纯文本的Base64格式,可以确保数据在任何文本环境中都能被安全、正确地传输。
常见应用场景包括:
- Data URI:在HTML或CSS中直接嵌入图片等小型二进制资源。
- 电子邮件(MIME):在邮件中附加二进制文件。
- Web API:在JSON或XML这类基于文本的格式中包含二进制内容。
Base64的编码原理
Base64的编码过程可以分为以下几个步骤:
- 分组:将原始二进制数据每3个字节(24比特)作为一大组。
- 拆分:将这个24比特的大组拆分为4个小组,每个小组6个比特。
- 查表:将每个6比特的小组转换成十进制数,这个数就是其在Base64码表中的索引。根据索引找到对应的字符。
- 拼接:将得到的4个字符拼接起来,即为编码后的结果。
Base64码表
Base64使用的64个字符包括:A-Z、a-z、0-9、+ 和 /。
| 索引 | 字符 | 索引 | 字符 | 索引 | 字符 | 索引 | 字符 |
|---|---|---|---|---|---|---|---|
| 0 | A | 16 | Q | 32 | g | 48 | w |
| 1 | B | 17 | R | 33 | h | 49 | x |
| 2 | C | 18 | S | 34 | i | 50 | y |
| 3 | D | 19 | T | 35 | j | 51 | z |
| 4 | E | 20 | U | 36 | k | 52 | 0 |
| 5 | F | 21 | V | 37 | l | 53 | 1 |
| 6 | G | 22 | W | 38 | m | 54 | 2 |
| 7 | H | 23 | X | 39 | n | 55 | 3 |
| 8 | I | 24 | Y | 40 | o | 56 | 4 |
| 9 | J | 25 | Z | 41 | p | 57 | 5 |
| 10 | K | 26 | a | 42 | q | 58 | 6 |
| 11 | L | 27 | b | 43 | r | 59 | 7 |
| 12 | M | 28 | c | 44 | s | 60 | 8 |
| 13 | N | 29 | d | 45 | t | 61 | 9 |
| 14 | O | 30 | e | 46 | u | 62 | + |
| 15 | P | 31 | f | 47 | v | 63 | / |
关于填充字符"="
当原始数据的字节数不是3的整数倍时,编码到最后会剩下1或2个字节。此时就需要用 =作为填充字符,以确保最终的Base64字符串长度是4的倍数。
- 剩下1个字节:在其二进制(8比特)后补
0000,凑成12比特,然后拆分为两个6比特的小组进行编码,最后在结果末尾补充两个=。 - 剩下2个字节:在其二进制(16比特)后补
00,凑成18比特,然后拆分为三个6比特的小组进行编码,最后在结果末尾补充一个=。
例如:
0neqiu(6字节)编码为MG5lcWl1(8字符,无需填充)。0neqi(5字节)编码为MG5lcWk=(8字符,填充一个=)。
Base64 Data URI格式
在Web开发中,有时会看到形如下方的Base64字符串:
1 | data:image/jpeg;base64,/9j/4AA... |
这被称为Data URI。它允许将数据(如此处的JPEG图片)直接嵌入到网页文档中。浏览器可以直接解析并显示它。
需要注意的是,data:image/jpeg;base64,这部分是头部信息,并非Base64内容本身。如果你需要提取原始的Base64编码,应当只取逗号 ,之后的部分。
总结
- 是什么:Base64是一种将二进制数据转换为文本字符的编码方案。
- 为什么用:为了在只支持文本的环境中安全地传输二进制数据。
- 如何工作:将每3个字节(24比特)的数据转换为4个可打印字符。
- 特点:编码后的数据体积会增大约33%,它不是加密算法。
- 填充:当原始数据长度不是3的倍数时,使用
=进行填充。
引用文章:
让你彻底理解Base64算法(Base64是什么,Base64解决什么问题,Base64字符串末尾的=是什么) - 知乎
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 0neqiu's Blog!
评论
