NAME¶
xxd -
  以十六進制形式表示
 
總覽 (SYNOPSIS)¶
xxd -h[elp]
 
xxd [options] [infile [outfile]]
 
xxd -r[evert] [options] [infile [outfile]]
 
描述 (DESCRIPTION)¶
xxd 建立 一個 指定 檔案
  或者 標準 輸入 的 十六
  進制 轉儲, 同時 也 可以
  把 十六 進制 轉儲
  轉換成 原來的 二進制
  形式. 同 
uuencode(1) 和 
uudecode(1)
  一樣, 它 也可以 把
  二進制 數據 轉換成 ASCII
  表示 形式, 這樣
  電子郵件 就可以
  安全的 傳輸. 但是 它 有
  一個 優點, 就是 可以 把
  解碼後 的 結果 輸出 到
  標準輸出. 同時 它
  還可以 用來 給 二進制
  檔案 打補丁.
 
選項 (OPTIONS)¶
如果 沒有 給定 
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
 
  - 顯示 版本 字符串.
    
 
   
告誡 (CAVEATS)¶
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 的
  行為.
 
例子 (EXAMPLES)¶
 
(譯者: 實際 輸出 可能 和
  例子 有 一些 出入, 只要
  理解 其 意思 就行了)
 
顯示 
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
 
返回值 (RETURN VALUES)¶
此 程式 返回 如下的
  錯誤碼:
  - 0
 
  - 一切 正常.
 
  - -1
 
  - 不支持 此 操作 ( xxd
      -r -i 仍然 不行).
 
  - 1
 
  - 解析 選項 錯誤.
 
  - 2
 
  - 輸入 檔案 出錯.
 
  - 3
 
  - 輸出 檔案 出錯.
 
  - 4,5
 
  - 指定 的 偏移量
      地址 不可 到達.
    
 
   
參見 (SEE ALSO)¶
uuencode(1), 
uudecode(1), 
patch(1)
 
 
警告 (WARNINGS)¶
這個 工具 古怪的 念頭
  是其 作者的 意思. 使用
  這個 工具的 任何 結果
  都由 自己 負責. 使用它,
  探索它, 你 終會 成為
  一個 高手.
 
 
版本 (VERSION)¶
此 手冊頁 為 1.7 版本的 xxd
  而寫.
 
作者 (AUTHOR)¶
(c) 1990-1997 by Juergen Weigert
 
<jnweiger@informatik.uni-erlangen.de>
Distribute freely and credit me,
 
make money and share with me,
 
lose money and don't ask me.
Tony Nugent
 
<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
  最先 開始 寫 本 手冊頁
 
Bram Moolenaar 做了 一些 小的
  改動. Juergen Weigert 完成了
  手冊頁 的 編寫.
 
[中文版維護人]¶
唐友 <tony_ty@263.net>
[中文版最新更新]¶
2002/1/22
[中國Linux論壇man手冊頁翻譯計劃]¶
http://cmpp.linuxforum.net