十六进制转 Base64

粘贴十六进制字节,即可得到同一数据的 Base64 形式。空格、冒号和 0x 前缀等分隔符会被自动去除,哈希值和指纹可以原样粘贴。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 把十六进制字符串粘贴到输入框。源编码已预选为十六进制,目标编码为 Base64。
  2. 无需整理格式:空格、换行、冒号、短横线以及 0x 或 \x 前缀都会被忽略。
  3. 如果结果要用在 URL、JWT 或 JSON Web Key 中,请把目标编码改为 Base64URL。
  4. 复制 Base64 结果。

为什么要把十六进制转成 Base64

大多数哈希工具以十六进制输出摘要,但很多协议要求使用长度短三分之一的 Base64。典型场景包括:

  • 子资源完整性(SRI)。脚本和样式表的 integrity 属性使用 Base64 摘要,例如 sha384- 后接 64 个 Base64 字符。
  • 内容安全策略(CSP)。允许内联脚本的哈希写作 'sha256-...',其中的值是 Base64。
  • HTTP API 中的校验和。Content-MD5 头和 Amazon S3 的校验和头携带的是二进制摘要的 Base64,而不是 md5sum 输出的十六进制字符串。
  • 更短的标识符。UUID 共 16 个字节,用十六进制写是 32 位,用无填充的 Base64URL 只需 22 个字符。

支持的十六进制格式

十六进制数字不区分大小写。解码前,转换器会去掉空白字符、换行、冒号、分号、逗号、短横线,以及 0x、\x、% 和 &#x 前缀。因此 AB:CD:EF 这样的 OpenSSL 指纹、0x12, 0x34 这样的 C 语言数组、\x12\x34 这样的转义字符串、百分号编码的字节以及带短横线的 UUID 都可以直接使用。

清理之后,数字个数必须是偶数,每两位表示一个字节。位数为奇数时会提示错误,这通常意味着丢失了开头的 0,比如本应是 0abc 却写成了 abc。

要编码字节,而不是十六进制文本

一个常见错误是把十六进制摘要粘贴到普通的“文本转 Base64”工具里。这样编码的是 0-9a-f 这些字符,而不是它们代表的字节,结果会比正确值长一倍:SHA-256 摘要会得到 88 个字符,而不是 44 个。SRI 属性、校验和头等需要二进制摘要的地方都会拒绝这样的值。本转换器会先把十六进制解码成字节,再进行编码。

# 命令行:十六进制摘要转 Base64
printf '%s' "$HEX" | xxd -r -p | base64

# 一步生成文件的 SRI 值
openssl dgst -sha384 -binary script.js | openssl base64 -A

# Python
base64.b64encode(bytes.fromhex(h)).decode()

// Node.js(遇到第一个非十六进制字符会静默停止)
Buffer.from(h, 'hex').toString('base64')

常见问题

为什么我的十六进制字符串报错?

要么输入中有不属于十六进制的字符,例如把数字 0 写成了字母 O;要么数字个数是奇数。错误提示会给出无效字符的位置;如果是奇数位,请检查是否漏掉了开头的 0。

Base64 结果会有多长?
先把十六进制位数除以 2 得到字节数,再按每 3 个字节 4 个字符计算并向上取整。64 位的 SHA-256 十六进制摘要会变成 44 个 Base64 字符,其中包括一个 =。
如何生成子资源完整性(SRI)哈希?
计算文件的 SHA-384 摘要,在这里把十六进制结果转换为 Base64,然后写成 integrity="sha384-..."。使用 OpenSSL 也可以一条命令完成:openssl dgst -sha384 -binary file.js | openssl base64 -A。
输出的是标准 Base64 还是 URL 安全格式?
默认输出带 + 和 / 的标准 Base64,这正是 SRI、CSP 和 HTTP 校验和头所要求的格式。如果需要 URL 安全的结果,请把目标编码选为 Base64URL。