免费工具 Base64 解码 / 编码在线工具(含图片转 Base64)
粘贴一段 Base64,马上看到里面是什么;中文转 Base64 不会乱码;把图片拖进来,直接拿到 Data URI 和 <img> 代码。解码出错时,会告诉你是哪个字符、在第几行第几列,以及结果到底是文字还是一个文件。
- 文字、图片、文件都能转
- 出错时说清原因
- 本地处理,不上传
Base64 解码或编码
示例是一条打包成 Base64 的统计事件,有些统计 SDK 就是这样把 JSON 塞进网址参数的。切换模式、粘贴你自己的内容,或者把图片直接拖到这个框里。
要解码的 Base64,或要编码的文字。带 data:…;base64, 前缀也能认。截图后可以直接粘贴到这里。
编码时用。解码时两种字母表都自动识别。
一般选 UTF-8。老系统、老网页导出的中文可能是 GBK(只能解码)。
{"event":"支付成功","properties":{"amount":199,"channel":"微信","utm_source":"newsletter"}}数据里的文件
按数据开头的字节识别,不看文件名。
原始数据(字节)
97
编码前的数据大小。
Base64(字符)
132
不算换行。
可以直接放进 src 或 url()。固定用标准字母表并带 =。
512 KB 以内的文件才显示。
前 256 字节:偏移、字节、可打印的 ASCII(同 xxd)。
检查结果
版本 v1.0更新于 更新记录
一段 Base64 能告诉你什么
Base64 的用处是让字节穿过只收文字的地方:JSON、网址、邮件、HTML 属性。解码还原的是字节,字节代表什么,取决于当初是怎么生成的。
标准还是 URL 安全
两套字母表只差两个字符。标准 Base64 用 + 和 /,这两个字符在网址里有特殊含义;URL 安全格式(Base64URL)换成 - 和 _,通常还去掉末尾的 =。JWT 一律用 URL 安全格式。
末尾的 =
每 3 个字节编成 4 个字符。数据长度不是 3 的倍数时,最后一组用 1 个或 2 个 = 补齐。= 不带数据,所以很多系统直接省掉。
为什么大了三分之一
Base64 结果约是原数据的 4/3,换行另算。30 KB 的图片转成 Base64 大约 40 KB(gzip 之前)。这是把二进制塞进文字的代价。
是文字还是文件
解码后会看开头几个字节:PNG、JPEG、GIF、WebP、SVG、PDF、ZIP 能认出来,给预览和下载;不是合法文字的数据显示十六进制,而不是一堆乱码。
Base64 是编码,不是加密。不需要任何密钥就能解开,所以用 Base64 包着的 token、密码、手机号,和明文一样谁都能看。
三种常见用法
按手上有的东西选模式。
-
1
解码一段 Base64
直接粘贴。换行、缺 =、URL 安全字符都能处理;有问题时会写出第几行第几列。中文乱码就换一下「文字编码」。
-
2
把文字转成 Base64
切到「文字 → Base64」再输入。放进网址参数时选 URL 安全、去掉 =;写邮件正文时勾「每 76 个字符换行」。
-
3
图片转 Base64
选文件、拖进来,或直接粘贴截图。复制 Data URI,或者现成的
<img>标签和 CSS 写法。
3 个字节怎么变成 4 个字符
Base64(RFC 4648)把每 3 个字节(24 位)切成 4 份、每份 6 位,再用 64 个字符的字母表各写成一个字符。下表是 RFC 第 10 节的测试向量。
- n 个字节带填充编码后是 4 × ⌈n ÷ 3⌉ 个字符
- 邮件(MIME,RFC 2045)每行最多 76 个字符;PEM 格式的密钥和证书每行 64 个(RFC 7468);网址和 JWT 不换行
- JavaScript 的
btoa()只收 U+00FF 以内的字符,中文要先转成 UTF-8 字节,本工具就是这样做的 - 各语言的标准写法:PHP
base64_encode、JavaBase64.getEncoder()、Pythonbase64.b64encode,它们都对字节编码,中文先按 UTF-8 转字节
| 输入 | 字节数 | Base64 | 填充 |
|---|---|---|---|
f | 1 | Zg== | 2 个 = |
fo | 2 | Zm8= | 1 个 = |
foo | 3 | Zm9v | 无 |
foob | 4 | Zm9vYg== | 2 个 = |
fooba | 5 | Zm9vYmE= | 1 个 = |
foobar | 6 | Zm9vYmFy | 无 |
同样两个字,Base64 却不一样
Base64 编的是字节,所以结果取决于文字按什么编码变成字节、用的是哪套字母表。下面的值都用 Python base64 模块核对过。
| 输入 | 设置 | Base64 | 为什么不同 |
|---|---|---|---|
中文 | UTF-8 | 5Lit5paH | 每个汉字 3 个字节(E4 B8 AD、E6 96 87) |
中文 | GBK | 1tDOxA== | 每个汉字 2 个字节(D6 D0、CE C4),按 UTF-8 解会乱码 |
中文 | UTF-16LE | LU6HZQ== | 每个字 2 个字节,低位在前 |
你好 | UTF-8 | 5L2g5aW9 | 和 PHP base64_encode("你好")(UTF-8 文件)一致 |
<<???>> | 标准 | PDw/Pz8+Pg== | 含 / 和 +,直接放进网址会出问题 |
<<???>> | URL 安全 | PDw_Pz8-Pg | 换成 - 和 _,去掉 = |
「Base64 解出来是乱码」,多数时候 Base64 本身没错,是文字编码对不上:老系统、老网页导出的数据常是 GBK。先在下拉里换编码试试,再怀疑数据。
Base64 出问题,多半在这几处
编码本身很简单,麻烦几乎都出在它周围。
用 btoa() 直接编码中文
btoa("中文") 会报 InvalidCharacterError;用 Latin-1 绕过去得到的结果,别的系统也解不对。先转成 UTF-8 字节再编码。
+ 在网址里变成了空格
标准 Base64 不做 URL 编码就放进查询参数,表单式解码会把每个 + 变成空格,对方就解不出来。用 URL 安全格式,或者把值做百分号编码。
大图片也做成 Data URI
Data URI 比原文件大三分之一,不能单独缓存,还会拖慢它所在的 HTML 或 CSS。只适合小图标;小程序里大图建议走文件上传,而不是 base64 字符串。
把 Base64 当成加密
Base64 什么都藏不住。Basic 认证头里的账号密码、JWT 载荷、「隐藏」字段里的数据,谁看到都能解开。
事件按结构发送,不必打包成字符串
有的统计方案把事件压成 Base64 塞进网址。TapCub 的脚本和各端 SDK 发送的是结构化事件,后端发生的事情也可以由服务端直接补发。
Base64 怎么在线解码?
把字符串粘贴进来,模式选「Base64 → 文字」即可。换行、data:…;base64, 前缀、缺少的 =、URL 安全的 - _ 都会自动处理;结果如果是图片等文件,会显示预览和下载链接,而不是一堆乱码。中文乱码时把「文字编码」换成 GBK 试试。
图片怎么转 Base64?
模式选「图片 / 文件 → Base64、Data URI」,然后选择文件、拖进框里,或直接粘贴截图。会同时给出纯 Base64、data:image/png;base64,… 这样的 Data URI,以及可以直接粘贴的 <img> 和 CSS 写法。文件只在浏览器里读取,不会上传。
Base64 怎么转成图片?
把图片的 Base64 或 Data URI 粘贴进来解码,工具按开头的字节认出 PNG、JPEG、GIF、WebP、SVG 等格式,直接显示图片并提供下载。
Base64 和 Base64URL 有什么区别?
Base64URL(RFC 4648 第 5 节)把 + 换成 -、/ 换成 _,放进网址和文件名都安全,通常还去掉末尾的 =。JWT 用的就是它。其余完全相同,本工具两种都能解。
Base64 是加密吗?安全吗?
不是加密,没有密钥,谁都能还原。它只是让字节能在只收文字的地方传递。要保护数据请加密;要确认数据没被改过,用签名或 SHA-256 这类哈希(MD5 / SHA-256 生成器)。
btoa() 编码中文为什么报错?
JavaScript 的 btoa() 只收 U+00FF 以内的字符,中文和 emoji 会报 InvalidCharacterError。先用 TextEncoder 把文字转成 UTF-8 字节,再对字节做 Base64,本页就是这样处理的。
我粘贴的内容会被上传吗?
不会。解码、编码和读文件都在你的浏览器里完成,不上传;这个工具也不生成分享链接,粘贴的 token 和文件只留在你的电脑上。