xxd 十六進位檢視工具
在 Linux 系統管理的日常工作中,我們經常需要處理二進位檔案、檢查檔案損毀情況,或是將二進位資料轉換為可讀取的格式進行除錯。雖然 hexdump 或 od 也是常用的工具,但 xxd 無疑是其中最直觀、功能最強大且最廣為人知的工具之一。
xxd 的全名是 "hex dump in both directions",這不僅意味著它能將檔案內容轉換為十六進位顯示,更支援將十六進位資料還原回原始的二進位格式。這篇文章將深入解析 xxd 的核心用法,幫助你掌握這個強大的文字處理利器。
xxd 的基本運作原理
預設情況下,xxd 會將輸入的檔案內容以「十六進位偏移量」、「十六進位位元組」以及「對應的 ASCII 字元」三種格式並列顯示。這種格式讓開發者能同時看到記憶體位址、實際數值以及可讀的字串內容,對於快速定位錯誤極具幫助。
讓我們透過一個實際範例來觀察。首先,我們建立一個簡單的測試檔案:
$ echo -n "Hello Linux World" > test.txt
$ xxd test.txt
00000000: 4865 6c6c 6f20 4c69 6e75 7820 576f Hello Linux Wo
00000010: 726c 64 rld
輸出解析:
- 第一欄 (
00000000:):這是十六進位的位址偏移量,表示當前行資料在檔案中的起始位置。 - 第二欄 (
4865 6c6c...):這是檔案內容對應的十六進位位元組。例如,48對應 ASCII 的H,65對應e。 - 第三欄 (
Hello Linux Wo):這是對應的 ASCII 字元顯示。若位元組對應到非可列印字元(如控制碼),則會顯示為.。
常用選項與進階應用
xxd 提供了多個選項來調整輸出格式,以下介紹幾個在實務上最實用的參數。
1. 使用 -c 調整每行顯示的位元組數
預設每行顯示 16 個位元組。若你想讓輸出更寬或更窄,可以使用 -c 參數。例如,設定每行顯示 8 個位元組:
$ xxd -c 8 test.txt
00000000: 4865 6c6c 6f20 4c69 Hello.Li
00000008: 6e75 7820 576f 726c 64 nux.World
2. 使用 -r 將十六進位轉回二進位
這是 xxd 最強大的功能之一。你可以將 xxd 的輸出透過管道傳給另一個 xxd -r 指令,即可還原原始檔案。這在備份或傳輸二進位資料時非常有用。
# 先產生十六進位 dump
$ xxd test.txt > dump.txt
# 確認 dump.txt 內容
$ cat dump.txt
00000000: 4865 6c6c 6f20 4c69 6e75 7820 576f Hello Linux Wo
00000010: 726c 64 rld
# 使用 -r 還原檔案
$ xxd -r dump.txt > restored.txt
# 比較原始檔與還原檔,確認內容一致
$ diff test.txt restored.txt
# 若無輸出,代表兩檔案完全相同
3. 使用 -p 產生純十六進位輸出
有時我們只需要純粹的十六進位字串,不需要偏移量或 ASCII 對照,這時可以使用 -p(plain 模式)。這對於腳本處理或嵌入到其他程式中非常便利。
$ xxd -p test.txt
48656c6c6f204c696e757820576f726c64
4. 使用 -s 跳過特定位元組
若檔案很大,你只想檢視檔案開頭或中間的某段資料,可以使用 -s 指定跳過的位元組數。
# 跳過前 5 個位元組,從第 6 個位元組開始顯示
$ xxd -s 5 test.txt
00000005: 6f20 4c69 6e75 7820 576f 726c 64 o Linux World
常見問題與注意事項
在使用 xxd 時,新手常會遇到一些誤解,以下列出兩個常見問題:
Q1: 為什麼還原後的檔案大小與原始檔不同?
這通常發生在使用 xxd -r 時,如果原始 dump 檔中包含非標準的十六進位格式(例如手動編輯過或混入其他文字),xxd 可能會忽略無效行,導致資料遺失。此外,若使用 -p 模式產生的純十六進位輸出進行還原,請確保該字串是連續且完整的,任何換行或空白都可能被視為分隔符號而影響解析。建議在進行重要資料還原前,先使用 diff 進行比對。
Q2: xxd 與 hexdump 有什麼差別?
hexdump 是 POSIX 標準的一部分,幾乎所有 Unix-like 系統都預裝,適合快速檢查。而 xxd 是 Vim 編輯器的一部分,雖然在大多數 Linux 發行版(如 Ubuntu、Debian)中預設安裝,但在某些最小化安裝的嵌入式系統中可能缺失。xxd 的優勢在於其雙向轉換能力(-r 選項)以及更直觀的 ASCII 對照欄位,特別適合需要反覆檢視與編輯二進位資料的情境。
小結
xxd 不僅是一個簡單的十六進位檢視器,更是一個強大的二進位資料轉換工具。透過熟練掌握 -c、-r、-p 等選項,你可以輕鬆地在文字與二進位之間切換,無論是除錯網路封包、檢查檔案標頭,還是備份二進位資料,xxd 都是 Linux 管理員不可或缺的瑞士刀。建議你在日常工作中多嘗試將 xxd 與 grep、awk 等文字處理指令串接,以發揮其最大的效率。