xxd 十六進位檢視工具 文章首圖

xxd 十六進位檢視工具

xxd 十六進位檢視工具

在 Linux 系統管理的日常工作中,我們經常需要處理二進位檔案、檢查檔案損毀情況,或是將二進位資料轉換為可讀取的格式進行除錯。雖然 hexdumpod 也是常用的工具,但 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 的 H65 對應 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 管理員不可或缺的瑞士刀。建議你在日常工作中多嘗試將 xxdgrepawk 等文字處理指令串接,以發揮其最大的效率。