什么是Base64?
Base64是一种用64个可打印字符表示二进制数据的编码方式,常用于在只能处理文本的媒介(如电子邮件、HTML、JSON)中传输或存储二进制数据。它将二进制数据转换为由64个字符组成的文本字符串,这些字符包括大小写字母、数字以及两个特殊字符(通常为+和/),末尾可能使用=填充。
编码原理
Base64编码的核心是将每3个字节(24位)的数据分成4组,每组6位,然后每个6位值映射到Base64字符集中的一个字符。如果最后剩余1个或2个字节,则用=填充至4的倍数。
Base64字符集:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + /
编码示例:
以字符串“Man”为例(ASCII编码):
M a n 0x4D 0x61 0x6E 二进制:01001101 01100001 01101110 分成4组6位:010011 010110 000101 101110 十进制:19 22 5 46 Base64字符:T W F u 所以“Man”的Base64编码为“TWFu”。
如果输入不足3字节,例如“Ma”:
M a 0x4D 0x61 二进制:01001101 01100001 分成两组6位:010011 010110 0001(剩余4位)-> 补0至6位:010011 010110 000100 对应字符:T W E 剩余一组用=填充:TWE=
Base64索引表
| 值 | 字符 | 值 | 字符 | 值 | 字符 | 值 | 字符 |
|---|---|---|---|---|---|---|---|
| 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 | / |
主要应用场景
- 电子邮件附件(MIME): SMTP协议仅支持ASCII文本,Base64将二进制附件转换为可传输的文本。
- Data URL: 在HTML或CSS中嵌入小图片,例如
data:image/png;base64,iVBORw0KGgo... - JWT(JSON Web Token): JWT的三个部分(Header、Payload、Signature)均使用Base64Url编码(URL安全变体)。
- HTTP基本认证: 用户名和密码组合成
username:password再进行Base64编码放入Authorization头。 - 存储二进制数据到文本数据库: 某些数据库或文本格式(如JSON)不能直接存储二进制,可使用Base64。
- URL参数传递: 通过URL安全的Base64变体(将+和/替换为-和_,并去掉=填充)传递数据。
注意事项
- Base64编码会使数据体积增加约33%(每3字节变成4字符)。
- Base64不是加密算法,它只是编码,不能用于保护敏感数据。
- URL中使用的标准Base64包含+/和=,可能被URL编码,应使用URL-safe变体。
- 解码时需注意填充字符=,有时实现会自动处理。
总结
Base64是一种简单实用的编码方式,它让二进制数据能在文本环境中畅通无阻。理解其原理有助于正确使用和调试相关技术。在实际开发中,我们应根据场景选择合适的编码方案(标准Base64或URL-safe Base64),并注意其不是加密手段。