十六進位轉 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。