十六進位編碼的運作原理
頁面上的每個字元都以一或多個位元組儲存。十六進位編碼將這些位元組以 16 進位改寫,每個位元組對應兩個字元,讓位元組流無需特殊工具即可閱讀。
- 將文字編碼為位元組. UTF-8 模式透過
new TextEncoder().encode(text)處理輸入,回傳一個位元組值的Uint8Array。Latin-1 模式則透過charCodeAt(0) & 0xFF取每個字碼單元的低八位,這與傳統 ISO-8859-1 編解碼器執行的轉換相同。 - 將每個位元組轉為兩位 hex 數字. 每個位元組透過
byte.toString(16).padStart(2, "0")映射為兩位 hex 數字。大小寫切換可選擇輸出字母為大寫(A-F)或小寫(a-f)。 - 套用分組與前綴. 分組在位元組之間插入分隔符:單一空格、短橫線,或每四個位元組加一個空格。0x 前綴可加在整個字串開頭(無分組模式)或每個位元組前(空格分組模式),以符合 C 陣列和二進位比對工具所預期的慣例。
- 反向解碼. Hex → 文字模式會去除輸入中所有的空格、短橫線和
0x前綴,以/^[0-9a-fA-F]+$/驗證剩餘字元,拒絕奇數長度字串,並從連續的位元組對重建Uint8Array。UTF-8 模式使用new TextDecoder("utf-8", { fatal: true })解碼陣列;Latin-1 模式將每個位元組映射為String.fromCharCode(b)。 - 即時模式加速迭代. 即時模式預設開啟。每次按鍵都會排程一個 150 毫秒防抖動的重新轉換,讓你在貼上、編輯時即可看到另一個欄位即時更新,無需按下轉換按鈕。
為何使用 hex 轉換器
- 偵錯二進位協定. Modbus、DNP3 和 CoAP 等線路格式將標頭封裝在特定的位元組偏移處。以 hex 讀取擷取的幀可一眼看出每個欄位,將同樣的位元組轉回 ASCII 則能顯露夾在二進位框架中的純文字酬載。
- 處理嵌入式韌體. JTAG 和 SWD 探針以 hex 回報記憶體內容。將某個記憶體區域轉為 ASCII 可找出嵌入的字串(檔案路徑、錯誤訊息、廠商簽名),通常能精確定位你在韌體中所查看的位置。
- 讀取封包擷取檔. Wireshark 和 tcpdump 都提供位元組窗格,左側以 hex 列印每個封包,右側顯示 ASCII。在此轉換一段內容,讓你可以從 bug 報告或聊天紀錄中複製 hex 資料塊,直接閱讀位元組實際內容,無需重新匯入擷取工具。
- 位元組層級的差異比對. 比較兩個二進位檔案通常需要找出哪些位元組有變化。以一致的分組方式將兩側都轉為 hex,可讓差異在文字編輯器中對齊,內建的差異工具即可標示出變更的位元組。
常見應用情境
只要位元組流不只是純文字酬載,Hex ↔ ASCII 轉換就會出現在逆向工程、資安和嵌入式開發的各個環節。
- 逆向工程:取得難以用 strings 工具提取的二進位 hex 轉儲,挑出可解碼為可列印 ASCII 的連續段落,並以這些字串定位反組譯碼中的位置。
- 網路鑑識:從 Wireshark 將單一封包酬載以 hex 複製出來,貼到此處,無需匯出整個擷取檔即可讀取應用層文字。
- 加密材料處理:金鑰、IV 或 HMAC 標籤通常以 hex 字串傳送。解碼回位元組可確認長度符合演算法要求(AES-128 為 16 位元組,AES-256 為 32 位元組),再接入設定。
實作範例
選擇文字 → Hex、UTF-8、小寫、每位元組加空格分組、不加前綴。輸入 Hi:輸出顯示 48 69。開啟前綴並將分組改為不分組,同樣的輸入變為 0x4869。貼上表情符號 😀 作為輸入,UTF-8 模式輸出 f0 9f 98 80 — 一個字碼點對應四個位元組,這就是為何表情符號常會增加傳輸大小。切換至 Hex → 文字,貼上 0x48-65-6C 6C 6F:解析器去除前綴、短橫線和空格後重建出 Hello。
FAQ
什麼是十六進位編碼?
十六進位編碼(hexadecimal encoding)以 16 進位寫出位元組流,每個位元組對應兩個 ASCII 字元。每個 hex 數字涵蓋四個位元,因此兩個數字涵蓋一個八位元位元組。字母表從 0-9 延伸至 A-F(或 a-f);大小寫純粹是顯示選擇,解碼器兩者皆接受。Hex 是在協定規格、除錯工具輸出和加密金鑰中寫出原始位元組的標準方式,因為它比二進位緊湊一倍,且避免了原始位元組在文字中的不可列印字元問題。
為什麼我的表情符號在 hex 中變成 4 個位元組?
UTF-8 是可變長度編碼。ASCII 字元(U+0000 至 U+007F)佔一個位元組,Latin-1 補充字元佔兩個,大多數其他 BMP 字碼點佔三個,U+FFFF 以上的字元(包括大多數表情符號)佔四個。笑臉 😀 是 U+1F600,編碼為 F0 9F 98 80。若需要固定寬度的位元組檢視,請切換至 Latin-1 — 但 Latin-1 僅涵蓋前 256 個字碼點,超出範圍的字元無法往返轉換。
支援 Latin-1 / ISO-8859-1 嗎?
支援。將文字編碼選項切換為 Latin-1(ISO-8859-1)。編碼時取每個 JavaScript 字碼單元的低八位(charCodeAt(0) & 0xFF),與傳統單位元組映射相符。解碼時對每個位元組使用 String.fromCharCode(byte)。在處理舊版 Windows-1252 或前 Unicode 系統的輸出時請使用 Latin-1,這些系統中每個位元組恰好代表一個字元。
轉換是在我的瀏覽器中進行嗎?
是的。轉換器以單一靜態頁面執行 TextEncoder、TextDecoder 和一個小型解析器。沒有上傳、沒有 API 呼叫,也不會分析你貼上的內容 — 僅有整個網站共用的標準頁面載入指標。你在此看到的 hex 位元組與 Node 腳本或 Lambda 函式對相同輸入產生的結果完全一致。
Hex ↔ ASCII 轉換是個小工作,但任何閱讀二進位協定或嵌入式韌體的人每天都要做好幾次。在瀏覽器分頁中完成,使用 Node 和 V8 原生就有的編解碼器,讓工作快速完成,位元組流也留在自己的裝置上。