十六進位解碼器是一種工具,它會將偶數長度的十六進位數字對轉成對應的 UTF-8 位元組,而安全的解碼器則以嚴格的驗證來處理,而不是靜默替換。以連續字串 48656c6c6f 為例:每一對 48、65、6c、6c、6f 會變成一個位元組,這五對解碼後會得到 ASCII 字母 H、e、l、l 與 o。可靠的十六進位解碼器可接受連續的配對、以 ASCII 空白分隔的群組,或是嚴格的逐位元組 0xNN 標記,但會拒絕奇數的半位元組、混合語法、非十六進位字母,以及不符合嚴格分隔符號集合的 Unicode 空白。接著它會以致命模式將位元組陣列送入 UTF-8 解碼器,因此任何孤立的續接位元組、過長編碼、編碼後的代理字元,或大於 U+10FFFF 的值,都會讓整個作業失敗,而不是被靜默替換成 U+FFFD。瀏覽器透過 TextDecoder 建構函式選項來提供這個致命模式,而 WHATWG 編碼標準與 RFC 3629 定義了有效的範圍,這代表以瀏覽器為基礎的 Hex to Text Converter 能在不上傳任何位元組到伺服器的情況下,實作與原生命令列工具相同的規則集。

hex decoder
Hex Decoder Explained: A Strict Path From Hex to UTF-8

十六進位解碼器的運作方式

可靠的十六進位解碼器會經過三個可預測的階段。首先,原始輸入會根據嚴格的語法規則進行檢查,以定義什麼算是有效的十六進位標記。其次,被接受的標記會被轉換成位元組陣列,其確切長度會在任何配置前先進行驗證,因此解析器無法靜默截斷過大的輸入。第三,該位元組陣列會送入以致命模式運作的 UTF-8 解碼器,因此任何格式錯誤的序列都會讓整個作業失敗,而不是回傳一個夾雜 U+FFFD 替換符號的部分字串。Hex to Text Converter 會在目前的瀏覽器分頁中完整執行這個三階段管線,因此不會有任何資料離開你的機器。

致命階段是大多數隨意解碼器最容易出錯的部分。標準的 TextDecoder 在預設設定下會將每個格式錯誤的序列替換成 U+FFFD 並繼續處理,這代表被截斷的三位元組序列或過長編碼會靜默地竄改你的輸出結果。安全的解碼器會使用 fatal: true,讓解碼器在遇到第一個無效序列時擲出例外,並完全不回傳任何內容。RFC 3629 定義了有效的 UTF-8 範圍以及 U+10FFFF 的 Unicode 純量上限;WHATWG 編碼標準在���器中反映了相同的規則,因此行為良好的解碼器會拒絕孤立的續接位元組、編碼後的代理字元,以及超過最大純量的四位元組值。

安全解碼器接受的輸入格式

嚴格解碼器通常支援的三種輸入家族為:連續配對、以空白分隔的群組,以及精確的 0xNN 標記。字串 48656c6c6f 是連續的;48 65 6c 6c 6f 是以空白分隔的;0x48 0x65 0x6c 0x6c 0x6f 是逐位元組前綴的。這三種都編碼了同樣的五個解碼為 ASCII 字串 Hello 的位元組,下表展示了實際的模式。

輸入樣式 範例 產生的位元組 解碼後的文字
連續配對 48656c6c6f 48 65 6c 6c 6f Hello
以空白分隔 48 65 6c 6c 6f 48 65 6c 6c 6f Hello
0xNN 前綴標記 0x48 0x65 0x6c 0x6c 0x6f 48 65 6c 6c 6f Hello

表格中的數值刻意維持很小,以讓關係保持明顯。實際的十六進位傾印每行可達數百個位元組,但解析規則並不會改變。

純模式只接受十六進位數字,且每組數字必須為偶數。ASCII 空白分隔為可設定,且唯一接受的分隔符號為空格、水平定位字元、換行字元、換頁字元與歸位字元。不中斷空格或任何其他 Unicode 間隔字元會被拒絕,而不是被隱形地正規化,這能防止從文書處理器複製貼上後產生錯誤位元組的問題。若前綴選項為開啟,每個標記都必須正好是 0xNN;同一個輸入中無法混用純式與前綴式,因此 0x41 42 會立即失敗。對於需要深入並排了解這兩種格式的讀者,純式與 0xNN 指南對此有詳細說明。

逐步將十六進位解碼為文字

每當你需要將十六進位解碼為可讀取文字且不出現意外時,請使用以下工作流程。

  1. 準備你的十六進位字串。判斷它是如 48656c6c6f 的連續配對、如 48 65 6c 6c 6f 的空白分隔群組,或是如 0x48 0x65 0x6c 0x6c 0x6f 的逐位元組標記。貼上之前,請先去除來自記憶體傾印的位址、ASCII 欄位或單元標�。
  2. 將字串貼到十六進位輸入欄位中。設定分隔符號選項以符合你的來源:對於有間隔的群組請開啟 ASCII 空白,若是單一連續字串則關閉。
  3. 選擇前綴行為。僅在每個標記確實都是 0xNN 時才啟用 0x 前綴;對於純十六進位則保持關閉,讓解析器拒絕帶前綴的輸入,而不是靜默地去除前綴。
  4. 執行解碼。解析器會檢查原始輸入預算、解析嚴格的十六進位標記、計算位元組數、配置位元組陣列,並以致命的 UTF-8 驗證進行解碼。任何編輯或選項變更都會立即清除先前的結果、錯誤與複製狀態。
  5. 讀取輸出。解碼後的文字會與精確的位元組計數一起出現在唯讀欄位中。若欄位為空並顯示錯誤,請先處理回報的特定問題——奇數半位元組、混合語法、無效位元組序列,或超過預算——再重試。
  6. 視需要複製結果。複製按鈕僅在解碼後文字有可複製的程式碼單元時才會啟用,且瀏覽器必須授與剪貼簿存取權限,寫入才會成功。若剪貼權限失敗,解碼後文字仍可選取,以便手動複製。

以連續字串 48656c6c6f 為例,可以清楚展示整個管線。每一對 48、65、6c、6c、6f 會變成一個位元組。48 是 H 的 ASCII 碼,65 是 e,6c 是 l,再次的 6c 是 l,而 6f 是 o,產生五個字元的字串 Hello,位元組計數為 5。這是單純的 ASCII 運算,因此不會觸發多位元組驗證,結果即為最終結果。

致命 UTF-8 模式與替換解碼的比較

現代瀏覽器的預設 UTF-8 解碼器是寬容的。當它遇到無法納入有效序列的位元組時,會插入 U+FFFD 並繼續。對於讀取長檔案的使用者來說,這種行為通常可以接受,但對於除錯編碼問題的人來說,它會隱藏他們正在尋找的訊號。被截斷的三位元組序列(如 E4 B8)後面若不是 80–BF 的續接位元組,就會變成替換符號而非錯誤。WHATWG 編碼標準將此描述為替換解碼器;同一份標準也定義了致命變體,會擲例外而非替換。

致命模式同樣能捕捉過長編碼、編碼後的代理字元,以及大於 U+10FFFF 的值。這些在 RFC 3629 下皆為非法,但替換解碼器仍會樂觀地將其翻譯為目標碼位。使用致命模式時,整個解碼會失敗且不會回傳部分輸出,這是自稱為十六進位解碼器而非十六進位猜測器的工具唯一誠實的行為。MDN 對 TextDecoder 建構函式的參考文件記載了致命選項,並證實瀏覽器有提供該選項。

解碼器必須遵守的限制、錯誤與預算

每個安全的解碼器都會施加明確的上限,以避免不良輸入耗盡記憶體,或將真正的錯誤隱藏為靜默截斷。Hex to Text Converter 強制執行三個獨立的預算,且每個限制都是精確的:超出其一個單位即會被拒絕,並附上未解碼、未回傳、未截斷的訊息。

預算 限制的內容 精確上限
原始輸入 解析前的十六進位字串 2,000,000 個 UTF-16 程式碼單元
解析後位元組 UTF-8 解碼前的位元組陣列 1,000,000 位元組
解碼後文字 致命解碼後的輸出文字 1,000,000 個 UTF-16 程式碼單元

解析器會在任何輸出陣列配置之前計算位元組數,這代表過大的輸入會在預算階段就被拒絕,而不是在部分配置之後才被拒絕。如 0x48 這樣的前綴記法,每個位元組會使用四個來源字元而非兩個,因此可能會先達到原始輸入預算,而非位元組預算。這樣的結果是預期內的,並會被回報;這不是錯誤。

錯誤訊息同樣具體。十六進位數字為奇數時會產生奇數半位元組錯誤。同一輸入中混用純式與 0x 前綴式會產生混合語法錯誤。任何非十六進位字母(如 G 或 Z)會產生語法錯誤。UTF-8 特定的失敗——孤立續接位元組、被截斷的多位元組序列、編碼後的代理字元、超過 U+10FFFF 的四位元組值,或部分位元組序標記——會產生無效位元組序列錯誤。這些皆為致命錯誤,不會回傳部分文字或替換字元。

十六進位解碼器不適用的情境

只有當你的輸入確實為十六進位位元組記法時,十六進位解碼器才是正確的工具。若你的資料是透過其他傳輸方式而來,請改用對應的工具。Base64 字串透過電子郵件與 JSON API 傳輸,需要 Base64 轉換器。二進位的 0 與 1 數字需要二進位轉文字轉換器。若你需要檢查帶有位址與 ASCII 欄位的格式化記憶體傾印,請先使用可信的工作流程擷取位元組欄位,再僅解碼十六進位位元組;此工作流程的完整指南位於十六進位傾印解碼文章。

還有兩種情況值得特別說明。首先,十六進位解碼器不應在 Windows-1252、ISO-8859-1、UTF-16 與 UTF-8 之間猜測,因為靜默猜測會改變位元組的意義。若你知道輸入為 UTF-16 little-endian 或 Windows-1252,請使用能明確解碼該編碼的工具。其次,十六進位解碼器不應將位元組解讀為整數、反轉其順序、移除空位元組,或求值跳脫序列,因為這些操作都不屬於將十六進位解碼為文字的一部分。堅持嚴格的 UTF-8 管線,才能讓工具保持誠實、輸出保持可預測。