ASCII 轉十六進位的轉換過程,是將文字串中的每個字元轉成其標準的 7 位元代碼,再以 16 進位表示該代碼。標準的 7 位元 ASCII 表正好定義了 128 個字元,編號從 0 到 127,而這些編號各自都有固定的十六進位對應值:大寫 A 是十進位 65、十六進位 41;數字 0 是十進位 48、十六進位 30;空白字元是十進位 32、十六進位 20;可列印的波浪號是十進位 126、十六進位 7E。ASCII 轉換器負責處理前半段流程,輸出每個字元的十進位代碼,而從十進位對應到十六進位只是純粹的算術步驟,可直接套用在這些數字上。每個對應關係皆遵循 IETF RFC 20,並與 Unicode C0 控制字元與基本拉丁文對照表交叉驗證,因此同一個字母在任何符合規範的工具上,都會對應到相同的十進位代碼與相同的十六進位代碼。

「ASCII 轉十六進位」真正的含義
這個詞涵蓋了兩個不同的操作。第一個是編碼步驟:輸入字串中的每個字元會被替換成其所指定的 7 位元代碼值。第二個是表示步驟:將該整數以十六進位寫出,方便與位元組、記憶體位址、設定資料、協定記錄等並列閱讀。兩個步驟都是確定性的,在十進位與十六進位之間切換並不會遺失或增加任何資訊——它們只是同一個底層數字的兩種表示法。
有必要精確說明其界線。ASCII 是一套 7 位元字元集,這代表合法的最大代碼是 127。「延伸 ASCII」這個說法有時會被寬鬆地用於 128 到 255 的值,但這些值不屬於任何單一標準;不同的作業系統和應用程式會賦予它們不同的意義。Windows-1252 和 ISO-8859-1 是兩個常見但互不相容的代碼頁,佔據了該範圍;若某個工具靜默地將 128 到 255 重新解讀為 ASCII,就會產生在某台機器上看起來正確、卻在另一台機器上壞掉的文字。嚴格的轉換器不會去猜測。
如何使用 ASCII 轉換器將 ASCII 轉成十六進位
- 開啟 ASCII 轉換器,選擇「text-to-codes」方向,讓每個字元對應到其十進位代碼值。
- 在輸入欄位中輸入或貼上你想編碼的 ASCII 文字。請保持在 7 位元的範圍內——一般英文字母、數字、標點符號以及基本的控制字元都沒問題。
- 選擇「Convert ASCII」。輸出欄位會以輸入順序,顯示每個字元以空格分隔、介於 0 到 127 之間的十進位整數。
- 將每個十進位整數轉換成兩位的十六進位對應值。供參考:十進位 65 變成十六進位 41、十進位 48 變成十六進位 30、十進位 32 變成十六進位 20、十進位 10 變成十六進位 0A。文字轉十六進位工具可以直接接收該十進位清單,並輸出十六進位字串,方便你跳過手動算術。
- 複製結果。如果輸入內容包含定位點、換行字元或其他控制字元,轉換後的輸出可能會難以閱讀,因為這些代碼會以不可見的方式呈現——在把十六進位形式視為正式結果之前,請先檢視十進位清單,確認實際被編碼的內容。
為何輸出是十進位而不是十六進位
ASCII 轉換器輸出十進位,是因為十進位是 RFC 20 中所定義 7 位元代碼值的標準形式,也是大多數程式語言、設定檔與參考資料表用來描述 ASCII 的形式。十六進位是同一個整數的其中一種表示方式,因此兩種表示之間的轉換不會喪失任何精度。以字串「Hi」為例的簡單示範:字母 H 是十進位 72、十六進位 48;字母 i 是十進位 105、十六進位 69。轉換器會產生「72 105」,對應的十六進位字串則是「48 69」。
堅持「先十進位」的做法有一個實務上的理由。輸出中的每個值都是介於 0 到 127 之間的單一整數,正好是嚴格 ASCII 工具能夠驗證的範圍。一旦輸出換成十六進位,使用者很容易在某個代號前面補上多餘的零、把位元組分群、或是只在某些代號前面加上 0x 前綴而其他沒有,而這種小小的不一致,正是會讓解析器與除錯器出錯的那種失誤。十進位輸出比較不容易被排版錯誤。
ASCII 字元及其十進位、十六進位對照值
下表展示了 7 位元 ASCII 表的一小段範圍。表中的十進位與十六進位值並非計算出來的,而是 RFC 20 所定義且被 Unicode C0 控制字元與基本拉丁文對照表所沿用的永久指派。這裡沒有「正確答案」的範圍;任何符合規範的實作都必須產生相同的配對。
| Character | Decimal code | Hex code | Category |
|---|---|---|---|
| NUL | 0 | 00 | Control |
| TAB | 9 | 09 | Control |
| LF | 10 | 0A | Control |
| CR | 13 | 0D | Control |
| Space | 32 | 20 | Printable |
| 0 | 48 | 30 | Digit |
| A | 65 | 41 | Uppercase letter |
| a | 97 | 61 | Lowercase letter |
| ~ | 126 | 7E | Punctuation |
| DEL | 127 | 7F | Control |
表中的每個值都是 7 位元,因此每個十六進位代碼剛好都是兩位十六進位數。這是標準 ASCII 的定義性特質——沒有長度前綴、沒有可變寬度編碼,也沒有需要擔心的多位元組序列。如果十六進位輸出中某個單一字元出現三位以上,那麼輸入已經不再是 ASCII,需要使用不同的轉換器。
控制字元與不可見的輸出
代碼 0 到 31 以及代碼 127 是控制字元,其中大多數不會產生可見的字形。TAB(十進位 9)會前進游標、LF(十進位 10)會開始新的一行、CR(十進位 13)會回到目前行的開頭,而 NUL(十進位 0)與 DEL(十進位 127)在任何文字編輯器中通常都是不可見的。當 ASCII 轉換器在「codes-to-text」模式下輸出這些字元時,輸出文字區看起來可能會比數字清單所暗示的還要短,因為畫面呈現了換行與定位點,但沒有顯示其他東西。這是正確的行為,而不是錯誤。
這種不可見性帶來一個實際的影響。如果你把解碼後的文字複製到另一個應用程式中,接收端的應用程式會依照自己的規則解讀這些控制字元,而夾帶在單行欄位中間的 TAB 或 LF 可能會產生令人意外的結果。對大多數除錯任務來說,十進位或十六進位的數字清單是比較安全的產物,因為每個字元都會以數字形式清楚呈現。若需要精確查看實際被編碼的內容,另一個合理的選擇是使用能明確顯示非可列印字元的位元組感知編輯器。
轉換器何時會拒絕輸入
轉換器刻意採取了嚴格的做法。編碼時,第一個超出 7 位元 ASCII 的字元會被拒絕,並回報其所在位置;因此若輸入內容包含破折號、帶腔調字母或表情符號,工具會拒絕將其靜默地重新解讀為 UTF-8 或某種舊式代碼頁。解碼時則要求純粹的十進位整數,並拒絕正負號、分數、十六進位前綴、空代號,以及任何大於 127 的值。可接受的範圍正好是 0 到 127,輸入上限為 100,000 個 UTF-16 字碼單元,解碼時則限制在 50,000 個字碼以內。
這些防護機制不是為了讓工具變得難用。它們的存在,是因為「ASCII 轉十六進位」這個說法常被寬鬆地用來泛指「文字轉十六進位」;若某個工具默默接受 Unicode 字元並將其輸出成多位元組的 UTF-8 十六進位,產出的結果看起來合理,卻無法在採用不同編碼的系統上解碼回原本的文字。採取「失敗時關閉」的策略,能迫使正確的工具用於正確的工作。對於 Unicode 字碼點、UTF-8 位元組、舊式代碼頁、二進位檔案或特定語系環境的字元轉換,請使用明確標示所需編碼的轉換器,而不是將其當作 ASCII 處理。
涵蓋相鄰情境的工具
ASCII 轉十六進位只是更大編碼問題家族中的一個切片。ASCII 轉換器負責嚴格的 7 位元切片。文字轉十六進位工具可將任何 UTF-8 文字編碼成十六進位位元組,讓帶腔調字元與表情符號都能正確往返。十六進位轉文字轉換器則依照明確的分隔符與 0x 前綴規則來解析十六進位位元組,且只會解碼完整有效的 UTF-8,不會進行靜默替換。對於需要以 U+ 標記法取得實際 Unicode 字碼點的字元層級工作,Unicode 編碼/解碼器才是正確的目的地。這些工具各自明確標示了其所實作的編碼,這比把「文字」視為單一整體類別來得更為穩妥。
若想進一步閱讀,請參考在 Python 中從十六進位到 Base64 且不破壞位元組。
若想進一步閱讀,請參考如何將 ASCII 轉為整數:精確的十進位值。