跳到主要内容

Base64 转 Hex 全指南:字节级把 Base64 转成十六进制

讲清 Base64 转十六进制的原理,先解码成字节再逐字节转 hex,适合查看二进制、调试和哈希对比,并说明它和直接重新编码的根本区别。

发布于 作者 李雷
#base64 #十六进制 #编码 #调试 #密码学

Base64 转 Hex 全指南:字节级把 Base64 转成十六进制

Base64 和十六进制看起来是两种风格迥异的字符串,一个混着字母数字加号斜杠,一个只有 0 到 f。但它们底下是同一样东西:一批原始字节。把 Base64 转成 hex,本质不是翻译,而是换个进制把同一批字节重新写一遍。理解这一点,你就不会再被"为什么转完里面没有可读文字"这种问题困住。

先解码成字节,再逐字节转十六进制

很多人以为 Base64 转 hex 是字符到字符的映射,其实中间隔着一层关键步骤:字节。

完整流程是两段:

  1. 把 Base64 解码成字节。Base64 每四个字符携带三个字节的信息,按 64 进制打包。工具读入字符串,按字母表反查出每个字符代表的 6 个比特,拼回原始的字节序列。
  2. 把字节序列输出成十六进制。每个字节是 0 到 255 的整数,正好用两位十六进制表示,比如 72 写成 48,200 写成 c8。逐字节拼起来就是 hex 串。

中间这批字节才是真正的数据,Base64 和 hex 只是它在不同进制下的两种写法。Base64 紧凑,适合塞进邮件、JSON、data URL;十六进制每字节固定两位,读起来对齐,哈希摘要、抓包、十六进制编辑器都偏爱它。

一个真实例子:SGk= 怎么变成 4869

拿最短的例子走一遍。字符串 SGk= 是合法的 Base64。

先解码成字节。S、G、k 在标准字母表里分别是第 18、6、36 号,对应 6 位二进制 010010 000110 100100。末尾的 = 是补齐符,说明这段只携带两个字节。把前 16 个比特切成两个字节:01001000 是 72,01101001 是 105。

再把这两个字节写成十六进制:72 是 48,105 是 69。拼起来就是 4869

SGk=  →  字节 [72, 105]  →  hex 4869

反过来也成立:4869 解析成字节 [72, 105],再编码回 Base64 就是 SGk=。顺带一提,这两个字节按 ASCII 正好是 "Hi",但这只是巧合,转换过程从没把它们当成文字看待。

它和"直接重新编码"的区别

这是最容易踩的概念坑。所谓直接重新编码,是指先把 Base64 解码成一段文本(通常按 UTF-8),再把那段文本编码成十六进制。听起来差不多,结果却可能完全两样。

差别出在不可打印字节上。一个值为 0xff 的字节不是合法的 UTF-8 字符。字节级转换不在乎这点,它只把 0xff 写成 ff,原样输出。可一旦中途强行解码成文本,0xff 会被替换成问号或者乱码占位符,字节就此被改写。等你再去比对哈希或还原密钥,数据已经坏了,而且坏得很隐蔽。

所以字节级这个词不是噱头。图片、AES 密钥、JWT 签名、DER 证书,这些二进制数据往返一圈必须逐字节一致。只要工具坚持"解码成字节,而不是解码成文本",0xff 这种字节就能完美保留。如果你需要的是文本转 hex 而非二进制,另一个方向的工具 文本转十六进制 更合适,它的输入本来就是字符。

三个最常用的场景

我自己最常用到 Base64 转 hex,是在排查密钥不匹配的时候。有次接口返回一段 Base64 的证书指纹,本地浏览器显示的却是冒号分隔的十六进制,两串怎么看都对不上。我把 Base64 粘进 Base64 转十六进制,转成按字节加空格的 hex,和浏览器那串并排一比,逐字节对齐,立刻确认是同一张证书,省下了凭肉眼瞪两种格式互相猜的半小时。

归纳起来,这类转换主要落在三处:

  • 查看二进制。一段不知来历的 Base64 blob,转成 hex 读前几个字节就能认出来:89 50 4e 47 是 PNG,ff d8 ff 是 JPEG,25 50 44 46 是 PDF。
  • 调试和搬运。库给的 AES 密钥是 Base64,OpenSSL 的 -K 要十六进制,转一下直接贴进命令,逐字节一致,不会因为某个编码步骤悄悄改了字节害你排查 "bad decrypt"。
  • 哈希与签名对比。JWT 签名是 URL-safe Base64,你在别处算好的 HMAC 是 hex,转成同一种进制才好逐位比对,一致就可信,有一位不同也立刻知道差在哪。

标准还是 URL-safe,别选错字母表

转换前先确认来源用的是哪套字母表。标准 Base64 用 +/ 作第 63、64 个字符,末尾用 = 补齐;URL-safe 把它们换成 -_,这样字符串能直接放进网址或文件名,而且通常省掉补齐。JWT 用的就是 URL-safe。

模式选错,后果很直接:一串满是 -_ 的 URL-safe 字符串按标准模式粘进来,那个 - 会被当成非法字符报错。所以拿到串先看一眼,有 - _ 就切 URL-safe,有 + / 就用标准。需要把字节在更多进制之间换写,可以看 Base32 / Base58 编码;只想做普通的 Base64 编解码,用 Base64 编码器 即可。

小结

Base64 转十六进制的核心只有一句:先解码成字节,再逐字节写成 hex,全程不碰文本编码。记住它和"重新编码成文本再转"的区别,你就能放心拿它处理密钥、签名、图片这类二进制数据,而不必担心某个不可打印字节在半路被悄悄改掉。


Made by Toolora · Updated 2026-06-13