如何将 Base64 解码为 ASCII
- 把 Base64 粘贴到 输入 · Base64。字符集 已预设为 ASCII。
- 在 输出 · 文本 中阅读结果。每个大于 127 的字节都显示为
�。 - 如果看到
�,说明内容不是纯 ASCII。把 字符集 切换为 UTF-8 或 Windows-1252 即可阅读。 - 点击 复制输出,或 下载 解码后的字节。
反方向把纯文本编码为 Base64,请使用 ASCII 转 Base64。
严格的 ASCII 解码
很多工具会把大于 127 的字节按某种 8 位字符集读取,于是非 ASCII 字节变成了一个看似合理的字母,没人会察觉。在本页,ASCII 到 127 为止,128 到 255 的每个字节都显示为替换字符。� 的个数就是非 ASCII 字节的个数。
因此,在把解码后的数据交给只接受 ASCII 的系统之前,可以用本页快速检查一下。UTF-8 中带重音的字母占两个字节,显示为 ��;弯引号占三个字节,显示为 ���。
示例
| Base64 | 字节(hex) | 按 ASCII 解码 |
|---|---|---|
QVNDSUk= | 41 53 43 49 49 | ASCII |
MjAwIE9L | 32 30 30 20 4F 4B | 200 OK |
YQli | 61 09 62 | a、制表符、b |
Y2Fmw6k= | 63 61 66 C3 A9 | caf��(UTF-8 的 café) |
4oCcaGnigJ0= | E2 80 9C 68 69 E2 80 9D | ���hi���(UTF-8 的 “hi”) |
最后两行在 字符集 设为 UTF-8 时能正确解码。状态行中的 看起来像 字段照样会给出格式,所以即使在 ASCII 模式下也能识别出 PNG 或 PDF;切换回 UTF-8 后,工具会给出对应文件解码器的链接。
一眼看出 Base64 中的 ASCII
ASCII 文本的 Base64 有可辨认的特征。由于每个字节都小于 80,每组 4 个字符中的第一个字符一定在 A–f 范围内,绝不会是 g–z、数字、+ 或 /。不过字符位置并不是一一对应的:3 个 ASCII 字符总是变成 4 个 Base64 字符,不是从 4 字符边界开始的子串无法单独解码。
如果你需要的是每个字符的编码,字节值只差一步:QVNDSUk= 的十进制是 65 83 67 73 73。Base64 转十进制 和 Base64 转 Hex 会列出这些值,Base64 转二进制 则显示每一位。
在代码中将 Base64 转为 ASCII
import base64
base64.b64decode("QVNDSUk=").decode("ascii") # 'ASCII'
base64.b64decode("Y2Fmw6k=").decode("ascii")
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3
list(base64.b64decode("QVNDSUk=")) # [65, 83, 67, 73, 73]
JavaScript 在这里有个坑:按照 WHATWG Encoding Standard,new TextDecoder("ascii") 是 Windows-1252 的别名,所以它会把 Y2Fm6Q== 解码成 café,永远不会报告非 ASCII 字节。请自己检查字节,例如用 bytes.every(b => b < 128)。更多内容见 JavaScript 中的 Base64 和 Python 中的 Base64。
常见问题
怎么把 Base64 转换成 ASCII 文本?
把 Base64 粘贴到上方。解码出的每个 0 到 127 的字节都会显示为对应的 ASCII 字符。在 Python 中,base64.b64decode(s).decode("ascii") 效果相同,遇到大于 127 的字节会抛出错误。
为什么输出里出现 � 符号?
这些字节不是 ASCII。通常是文本为 UTF-8,含有带重音的字母、弯引号或 emoji;把字符集切换为 UTF-8 即可正常阅读。如果输出大部分都是 �,数据很可能是一个文件。
怎么得到数字形式的 ASCII 码?
用 Base64 转十进制 得到 65 83 67 73 73 这样的字节值,或用 Base64 转 Hex 得到 41 53 43 49 49。
ASCII 文本里会有看不见的字符吗?
会。制表符、回车、换行以及其他 0–31 的控制字符都属于 ASCII。它们会正常解码,所以单词之间的制表符会保留为制表符。