xxd -
以十六進位制形式表示
xxd -h[elp]
xxd [options] [infile [outfile]]
xxd -r[evert] [options] [infile [outfile]]
xxd
建立一個指定檔案或者標準輸入的十六進位制轉儲,同時也可以
把十六進位制轉儲轉換成原來的二進位制形式。同
uuencode(1) 和
uudecode(1)
一樣,它也可以把二進位制資料轉換成
ASCII
表示形式,這樣電子郵件就可以
安全的傳輸。但是它有一個優點,就是可以把解碼後的結果輸出到
標準輸出。同時它還可以用來給二進位制檔案打補丁。
如果沒有給定
infile
就用標準輸入。如果
infile 是一個 “-”
字元,也從標準輸入讀入。如果沒有給定
outfile
(或者它的檔名是
一個 `
-´
字元),結果將輸出至標準輸出。
注意我們用的是一個很“懶”的解析器,它只檢查選項的第一個字元,
除非這個選項有引數。在一個單字元的選項和它的引數之間的空格
可有可無. 選項的 引數
可以 用 十進位制,
十六進位制 或者
八進位制的 形式 指定.
也就是說 -c8
, -c 8,
-c 010
和
-cols 8 是 等價的.
-
-a | -autoskip
- 開啟/關閉 autoskip:
用一個 單獨的 '*' 來
代替 空行. 預設 關閉.
-
-b | -bits
- 轉到
位元(二進位制 數字)
模式, 而 不是
十六進位制 模式. 在
這種 模式 下, 每個
字元 被 表示成 八個 0/1
的 數字, 而 不是
一般的 十六進位制
形式. 每 一行 都 以
一個 用 十六進位制
形式 表示的 行號,
後面 是 ascii (或者 ebcdic) 形式
開頭. 命令列 選項 -r, -p, -i
在 這個 模式下
不起作用.
-
-c cols | -cols cols
-
-c cols | -cols cols 每行
表示 <cols> 個 字元.
預設 16 (-i: 12, -ps: 30, -b: 6). 最多 256.
-
-E | -EBCDIC
- 把 右手邊的 字元
編碼 從 ASCII 變為 EBCDIC. 這個
並不 改變 其
十六進位制 表示
形式. 同 -r, -p 或者 -i
一起用 是 沒有
意義的.
-
-g bytes | -groupsize bytes
- 每 <bytes> 個 字元
(每 兩個 十六進位制
字元 或者 八個
二進位制 數字) 之間
用 一個 空格 隔開. 用
-g 0 禁止 分組. 在 普通
模式 中 <Bytes> 預設 是
2 在 二進位制 模式
中 是 1. 分組 並不
適用於 postscript 或者 include style
選項.
-
-h | -help
- 顯示 可用 命令
概述 並且 退出. 不做
其它 任何 事情.
-
-i | -include
- 輸出 為 C 語言的
包含 檔案 形式. 除非 xxd
從 標準輸入 讀入,
不然 會 輸出 一個
完整的 靜態 陣列
定義(與 輸入 檔案
同名).
-
-l len | -len len
- 輸出 <len> 個
字元 後 停止.
-
-p | -ps | -postscript |
-plain
- 以 postscript 的 連續
十六進位制 轉儲
輸出. 這 也叫做 純
十六進位制 轉儲.
-
-r | -revert
- 逆向 操作: 把
十六進位制 轉儲 轉換
(或者 打補丁) 成
二進位制 形式. 如果
不 輸出 到 標準輸出, xxd
並不把 輸出 檔案
截斷, 而是 直接 寫到
輸出 檔案. 用 -r -p 來 從
一個 沒有 行號 沒有
某種 列格式 的 純
十六進位制 轉儲
讀入. 附加的 空格 和
換行 可以 出現 在
任何 地方.
- -seek offset
- 用在 -r 之後:
會在 當前 檔案的
偏移量 上 增加
<offset>.
- -s [+][-]seek
- 從 infile 的 絕對 或者
相對 偏移量 <seek>
開始. + 表示 相對於
標準 輸入 當前的
位置 (如果 不是
標準輸入 就 沒有
意義了). - 表示 從
檔案 末尾 (如果 和 +
連用: 從 標準輸入
當前 位置) 向前 數
一些 字元, 從 那個
地方 開始. 如果 沒有 -s
選項, xxd 從 當前 位置
開始.
- -u
- 用大寫字母.
預設的是小寫字母.
-
-v | -version
- 顯示 版本 字串.
xxd -r 在 對待 行號 上
有一些 地方 值得 注意.
如過 輸出 檔案 可以
定位, 那麼 在
十六進位制 檔案 中的
行首的 行號 可以 重疊,
順序 可以 打亂, 還 可以
略去 一些 行號. 這種
情況 下, xxd 會 用
lseek(2) 來
定位. 如果 輸出 檔案
不可以 定位, 那麼 行號
可以 不連續, 但是 必須
按 順序, 這種 情況 下,
中間 會 插入 null 字元.
xxd -r 從不 輸出 解析
錯誤. 錯誤 會 被跳過.
在 編輯 十六進位制
檔案時 要 注意
xxd -r 在
讀入 足夠列 之後
會跳過 本行 後面
所有的 資料 (見 選項 -c).
這 就是說 對可列印的
ASCII (或者 EBCDIC) 的修改
都會被 忽略. 用 xxd -r -p
把一個 純十六進位制
轉儲檔案 (或者 postscript)
恢復 成 二進位制檔案
與 列數 是否 正確 沒有
什麼 關係, 它會 解釋
所有 看起來 像 兩個
十六進位制的 數字.
請 注意
% xxd -i file
和
% xxd -i < file 的 區別.
因為
lseek(2) 是 用來 重置
輸入指標的, 所以
xxd -s +seek
和
xxd -s seek 是 有區別的.
如果 輸入 是 標準輸入,
並且 在 xxd 被執行是
它的 標準輸入的 指標
位置 不是在 檔案的
開頭, 那麼 多了個 '+'
效果 就會 不一樣了.
下面的 例子 可能
幫助你 弄清楚(也可能
讓你 更糊塗)...
在讀 之前 需要 重置
輸入的 檔案指標; 因為
`cat' 已經 讀到了 輸入的
檔案尾.
% sh -c 'cat > plain_copy; xxd -s 0 > hex_copy' < file
從 0x480 (=1024+128) 開始讀. `+' 表明
"相對於 當前的
檔案位置", 也就是說
從 dd 讀了 1k, 在此 基礎上
再加 `128'.
% sh -c 'dd of=plain_snippet bs=1k count=1; xxd -s +128 > hex_snippet'
< file
從 0x100 ( = 1024-768) 開始讀.
% sh -c 'dd of=plain_snippet bs=1k count=1; xxd -s +-768 > hex_snippet'
< file
可是, 這種 情況 很少
發生, 我們 也 很少
需要用 `+'. 當用了 -s 是,
作者 比較 喜歡 用
strace(1)
或者
truss(1) 去 監控 xxd 的
行為.
(譯者: 實際 輸出 可能 和
例子 有 一些 出入, 只要
理解 其 意思 就行了)
顯示
file 除了 前 三行
(十六進位制 的 0x30) 的
所有 內容.
% xxd -s 0x30 file
顯示
file 最後 三行
(十六進位制 的 0x30) 的
所有 內容.
% xxd -s -0x30 file
顯示 120 個 字元, 每行 20 個
字元, 連續 顯示.
% xxd -l 120 -ps -c 20 xxd.1
2e544820585844203120224d616e75616c207061
676520666f7220787864220a2e5c220a2e5c2220
32317374204d617920313939360a2e5c22204d61
6e207061676520617574686f723a0a2e5c222020
2020546f6e79204e7567656e74203c746f6e7940
7363746e7567656e2e7070702e67752e6564752e
顯示 120 個 字元, 每行 12 個
字元.
% xxd -l 120 -c 12 xxd.1
0000000: 2e54 4820 5858 4420 3120 224d .TH XXD 1 "M
000000c: 616e 7561 6c20 7061 6765 2066 anual page f
0000018: 6f72 2078 7864 220a 2e5c 220a or xxd"..\".
0000024: 2e5c 2220 3231 7374 204d 6179 .\" 21st May
0000030: 2031 3939 360a 2e5c 2220 4d61 1996..\" Ma
000003c: 6e20 7061 6765 2061 7574 686f n page autho
0000048: 723a 0a2e 5c22 2020 2020 546f r:..\" To
0000054: 6e79 204e 7567 656e 7420 3c74 ny Nugent <t
0000060: 6f6e 7940 7363 746e 7567 656e ony@sctnugen
000006c: 2e70 7070 2e67 752e 6564 752e .ppp.gu.edu.
只 顯示 xxd.1 中 的 日期.
% xxd -s 0x28 -l 12 -c 12 xxd.1
0000028: 3231 7374 204d 6179 2031 3939 21st May 199
把
input_file 考到
output_file 並 在
前面 增加 100 個
位元組的 0x00.
% xxd input_file | xxd -r -s 100 > output_file
給 檔案 xxd.1 中的 日期 打
補釘.
% echo '0000029: 3574 68' | xxd -r - xxd.1
% xxd -s 0x28 -l 12 -c 12 xxd.1
0000028: 3235 7468 204d 6179 2031 3939 25th May 199
建立 一個 65537 位元組的
檔案, 所有 位元組 都是
0x00, 除了 最後 一個
位元組 是 'A'
(十六進位制 0x41).
% echo ´010000: 41´ | xxd -r > file
開啟 autoskip, 顯示 上例 中
建立的 檔案.
% xxd -a -c 12 file
0000000: 0000 0000 0000 0000 0000 0000 ............
*
000fffc: 0000 0000 40 ....A
建立 一個 只 含有 一個 'A'
的 檔案. '-r -s' 後面 的 數字
同 檔案 中的 行號 相
抵消; 結果是 開頭 的
位元組 被 跳過了.
% echo '010000: 41' | xxd -r -s -0x10000 > file
在 編輯器, 比如
vim(1) 中
把 xxd 當成 一個 過濾
程式 來用, 用
十六進位制 來 顯示 被
標記 為 'a' 和 'z' 中間 的
區域.
:'a,'z!xxd
在 編輯器, 比如
vim(1) 中
把 xxd 當成 一個 過濾
程式 來用, 用來 恢復 被
標記 為 'a' 和 'z' 中間 的
區域 的 十六進位制
顯示.
:'a,'z!xxd -r
在 編輯器, 比如
vim(1) 中
把 xxd 當成 一個 過濾
程式 來用, 用來 恢復
一行的 十六進治 顯示.
把 游標 移動 到 相應行
並 鍵入:
!!xxd -r
從 序列線 中 讀入
一個個的 單獨的 字元.
% xxd -c1 < /dev/term/b &
% stty < /dev/term/b -echo -opost -isig -icanon min 1
% echo -n foo > /dev/term/b
此 程式 返回 如下的
錯誤碼:
- 0
- 一切 正常.
- -1
- 不支援 此 操作 ( xxd
-r -i 仍然 不行).
- 1
- 解析 選項 錯誤.
- 2
- 輸入 檔案 出錯.
- 3
- 輸出 檔案 出錯.
- 4,5
- 指定 的 偏移量
地址 不可 到達.
uuencode(1),
uudecode(1),
patch(1)
這個 工具 古怪的 念頭
是其 作者的 意思. 使用
這個 工具的 任何 結果
都由 自己 負責. 使用它,
探索它, 你 終會 成為
一個 高手.
此 手冊頁 為 1.7 版本的 xxd
而寫.
(c) 1990-1997 by Juergen Weigert
<
[email protected]>
Distribute freely and credit me,
make money and share with me,
lose money and don't ask me.
Tony Nugent
<
[email protected]> <
[email protected]>
最先 開始 寫 本 手冊頁
Bram Moolenaar
做了一些小的改動,
Juergen Weigert
完成了手冊頁的編寫。
唐友 <[email protected]>
2002/1/22
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh