如何修复 Base64 字符串
- 把损坏的值粘贴到 要检查的 Base64。保留两边的引号、前缀和换行,工具需要靠它们判断发生了什么。
- 选择 输出格式:标准带填充、标准无填充、URL 安全带或不带填充、MIME(每行 76 字符,CRLF)或 PEM(每行 64 字符)。
- 查看 修复了什么。每项修复单独列出,你可以分清哪些是无害的清理,哪些改动可能丢了数据。
- 复制或下载结果,点击 校验结果 对它做完整检查,或点击 下载解码后的文件 保存字节。
能修复哪些问题
| 你粘贴的内容 | 发生了什么 | 修复结果 |
|---|---|---|
"SGVsbG8gd29ybGQ\u003d" | 带转义 = 的 JSON 字符串 | SGVsbG8gd29ybGQ= |
SGVsbG8%3D | 在 URL 中被百分号编码 | SGVsbG8= |
PDw/Pz8 Pg== | + 在查询字符串中变成了空格 | PDw/Pz8+Pg== |
PDw_Pz8-Pg | URL 安全且无填充 | PDw/Pz8+Pg== |
SGVsbG8gd29ybGQ | 填充被去掉了 | SGVsbG8gd29ybGQ= |
SGVsbG8=V29ybGQ= | 两个值被拼接在一起 | SGVsbG9Xb3JsZA==(HelloWorld) |
SGVsbG9= | 未使用的位不为零 | SGVsbG8= |
Authorization: Basic … | 连同请求头名称一起复制 | 只保留令牌 |
它还会去掉 data:…;base64, 前缀和 PEM 的 -----BEGIN …----- 行,剥掉普通引号,把字面的 \n 和 \/ 还原成字符(PHP 的 json_encode 默认会写出 \/),删除空白和换行,统一混用的 +/ 和 -_ 字母表,并修正 = 的数量。
对于拼接的值,每一段会分别解码,再把字节连起来;当程序把各自带填充的数据块一个接一个追加时,这样做是正确的。如果改为删掉中间的 =,后面所有的位都会错位,得到一堆乱码。
可能掩盖真正问题的修复
有两种修复会作为警告报告,因为它们靠的是猜测:
- 已移除非法字符。 如果字符串中有
*、#或零散的 Unicode 字符,工具会删除它,并列出删掉了哪些字符。数据中间的字符可能原本是一个被弄坏的真实符号,这种情况下,从那个位置开始解码出的字节仍然是错的。 - 已丢弃一个多余字符。 除以 4 余 1 的长度不可能由任何编码器产生,所以要么多了一个字符,要么字符串被截断了。工具会丢掉最后一个字符,让其余部分可以解码;但如果值被截断了,文件末尾就已经丢失。被截断的图片通常底部是灰色或缺失的;被截断的 ZIP 打不开。
出现这两种警告时,请设法重新获取原始数据:一条没被截断的日志、完整的 API 响应,或者直接从邮件服务器取回的附件。
为什么简单的修复不够
网上常见的“修复” Base64 的代码片段,会处理空白、URL 安全字符和填充:
def fix_base64(s):
s = "".join(s.split())
s = s.replace("-", "+").replace("_", "/").rstrip("=")
return s + "=" * (-len(s) % 4)
它能正确修复 SGVsbG8gd29ybGQ 和 PDw_Pz8-Pg。但如果输入 PDw/Pz8 Pg==(其中的 + 变成了空格),它会删掉空格,只剩 9 个数据字符。Python 随即报错:“number of data characters (9) cannot be 1 more than a multiple of 4”。JSON 转义、%3D、拼接的数据块和前缀也会这样漏网。这里的修复功能会逐一尝试每种修复,只有在结果长度有效时才会把空格换回加号。
更稳妥的长期办法是从源头解决:把 Base64 放进 URL 之前先做百分号编码,或者使用 Base64URL,并避免把它放到会重新换行或转义文本的地方。如果修复后的字符串解码出的内容仍然不对,Base64 错误指南 讲解了乱码和重复编码,Base64 解码器 可以显示字节。
常见问题
Python 报 "Incorrect padding" 怎么解决?
补 = 直到长度是 4 的倍数:s + "=" * (-len(s) % 4)。如果还报错,说明字符串还有别的损坏,比如空格或转义;粘贴到这里看看还有什么问题。
为什么我的 Base64 里有空格?
通常是 + 经过 URL 查询字符串或 HTML 表单时没有做百分号编码,接收方把它变成了空格。如果还原后长度有效,修复功能会把 + 放回去。
修复会丢失数据吗?
删除非法字符或末尾多余的一个字符时可能会,修复列表会明确说明。如果工具提示它因为数据被截断而丢弃了一个字符,请重新获取一份完整的原始数据,不要轻信这个结果。
Base64 末尾的 \u003d 是什么意思?
它是 = 的 JSON 转义。有些 JSON 库(比如 Gson)为了 HTML 安全会转义 =。JSON 解析器会自动把它还原;当你粘贴原始文本时,修复功能也会这样做。