Base64 详解:为什么会让数据变大,以及如何解码
Base64 用 64 个字符把二进制数据写成纯文本:A 到 Z、a 到 z、0 到 9,外加 + 和 /。每 3 个字节变成 4 个字符,所以文本比它所承载的数据长大约三分之一。当某种格式只接受文本时,人们会使用它,例如网页中的数据 URL、JSON 字段或电子邮件附件。
为什么文本格式需要它
许多格式只为文本而设计。电子邮件正文、JSON 文件和 CSS 文件可以安全地容纳字母和符号,但原始图片或 zip 文件包含的字节值,可能会被某些系统改动、截断,或被当作控制码解读。Base64 只使用每个文本系统都会原样传递的字符,因此数据能够完整送达。它由 RFC 4648 定义。
Base64 是一种编码,而不是加密。任何人都无需密钥即可解码,因此绝不能用它来隐藏密码或个人数据。
三个字节如何变成四个字符
以单词 Man 为例,它是三个字节:十进制的 77、97 和 110。这三个字节共 24 位。把这 24 位切成四组,每组六位,每组就是 0 到 63 之间的一个数字,对应字母表中的一个字符。Man 变成 TWFu。
六位只能表示 64 个值,所以四个字符承载三个字节。因此,即使还没有加上换行,输出也比输入大约多出三分之一。
当数据不能被三个字节整除时,编码器会在末尾用 = 号补齐。Ma 是两个字节,编码后变成 TWE=;M 是一个字节,变成 TQ==。填充符告诉解码器,最后一组包含多少个字节。
文本必须先用 UTF-8 编码
Base64 处理的是字节,而文本由字符组成。像 é 或 ✓ 这样的字符,在 UTF-8(整个网络通用的编码方式)中会占用不止一个字节。浏览器函数 btoa() 接受一个字符串,并把每个字符当作一个字节处理,因此遇到基本拉丁字母范围以外的字符就会失败。对一个勾号调用它会抛出 InvalidCharacterError。
解决办法是先把文本转换为 UTF-8 字节,再对这些字节编码。短语 héllo ✓ 在 UTF-8 中是 10 个字节,它的 Base64 是 aMOpbGxvIOKckw==。Base64编码与解码工具会替你完成这一步。解码时,它会把字节按 UTF-8 读回。如果字节不是有效的 UTF-8 文本,工具会将其视为文件,并提供下载。
URL 安全的 Base64
标准字母表包含 + 和 /。在 URL 中,+ 可以表示空格,/ 用来分隔路径的各个部分,因此 Base64 字符串可能会破坏链接。URL 安全形式(RFC 4648,第 5 节)改用 - 和 _,并且通常去掉 = 填充。当字符串要放进 URL、文件名或令牌中时使用它。解码器无论是哪种形式、有没有填充都能接受。
如果 Base64 来自一个链接,请先解码 URL。链接中经过百分号编码的值,必须先解码,才能读取其中的 Base64 内容。百分号编码指南介绍了链接的相关规则。
登录令牌是常见的例子:JSON Web Token 由三部分 Base64url 字符串通过点号连接而成,分别是头部、数据和签名。JWT 解码器可以拆分它,并把头部和数据以易读的 JSON 形式显示出来。
数据 URL 与图片
数据 URL 把文件直接放进链接本身。它的格式是 data:,然后是媒体类型,然后是 ;base64,再加逗号和数据。一张小图片会变成 data:image/png;base64,后面跟着编码后的字节。网页和样式表都支持这种形式,对于很小的图标来说,可以省去一次请求。
代价在于体积。数据大约增大三分之一,并且它存在于页面或样式表内部,而不是浏览器可以缓存的独立文件。数据 URL 适合小图片,不适合大照片。如果照片很大,请先压缩图片再进行编码。
在工具中解码 Base64 时,它会查看数据开头的几个字节。PNG、JPEG、GIF 和 WebP 文件各自以已知的文件签名开头,因此工具会显示预览并提供下载。图片类型的数据 URL 也会以图片形式显示。
在 fixmint 中操作
- 在文本或 Base64上方选择编码或解码,然后粘贴你的文本或 Base64。
- 对于令牌、文件名和链接,勾选URL 安全字母表,不使用 = 填充。无论是否勾选,解码器都能接受两种形式。
- 如果要从文件生成数据 URL,把文件拖放到拖放区,并勾选对于文件:输出 data: URL。
- 复制结果。如果解码出的字节是文件而不是文本,请使用工具提供的下载。
常见解码错误
- 包含不允许的字符。 输入中含有 64 个字符之外的字符,例如从句子中复制来的引号。请检查文本的来源。复制的文本中如果有零宽空格,也会导致同样的错误,因此请先删除不可见字符再试一次。不可见字符指南介绍了它们的来源。
- 长度不对。 缺少或多出了字符,通常意味着复制时内容被截断。
- 换行和空格。 电子邮件(MIME)每 76 个字符就会换行一次。解码器会删除空格和换行,因此你可以原样粘贴换行后的文本。
- 缺少填充。 有些系统会去掉 = 号。解码器会将其补回。
特殊情况
- 解码结果看起来像乱码。 它可能是文件而不是文本。zip 文件、PDF 或程序解码后得到的字节无法读作文本。工具会将这些内容作为下载提供。
- 超大输入。 编码或解码时,整个文件都会保存在浏览器中,因此非常大的文件可能会很慢,在手机上甚至可能失败。
快速问答
Base64 和加密一样吗?
不一样。它是一种可逆的编码,没有密钥,任何人都能解码。
为什么我的 Base64 比文件还大?
每 3 个字节变成 4 个字符,因此文本大约增大三分之一。
为什么复制的 Base64 字符串无法解码?
通常是复制时丢失或多出了某个字符,例如换行位置不对,或缺少最后一个字符。请从原始来源重新复制。
由 AI 辅助翻译自英文原文。
评论
还没有评论。快来抢沙发。


