DESCRIPTION
xxd 建立一個指定文件或者標准輸入的十六進制轉儲,同時也可以把十六進制轉儲轉換成原來的二進制形式。它可以把二進制數據轉換ASCII表示形式,而且可以以ASCII的形式顯示到標准輸出。
OPTIONS
如果沒有給定輸入文件,標准輸入就作為輸入文件infile。如果infile是一個‘-' 字符,也從標准輸入讀入。如果沒有給定outfile (或者它的文件名是一個‘-'字符), 結果將輸出至標准輸出。
-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。
-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 -ifile和% 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 指定 的 偏移量 地址 不可 到達。
應用例子:
(1)前段時間接觸了硬件仿真,關於文件制作,除了dd之外,這個xxd名令更方便,所以下次取中心的時候可以試下。
(2)對於一個二進制文件,通過xxd可以已十六進制換成字符的形式表示出來,這個在上邊的實例中已經可以得到;
問題時對於一個已十六進制字符形式的文本文件如何轉化成二進制文件?
首先為什么會提出這個問題?
a)早期的程序時如何書寫,轉化的。即使對於機器碼就不能用十六進制的文本文件通過程序處理兒爾得到嗎?
(十六進制文本文件:我們從屏幕上看到的文件內容時0x13,但是其硬件存儲上時二進制0x31和0x33,那么
如何依本文件的內容來生成二進制文件,且文件的二進制表示時0x13)
b)操作板子的時候遇到了問題,盡管顯示命令已正確執行,但是實際上經過測試硬件上的數據,命令並沒有正確執行,這令我感覺很奇怪(代碼沒有改動)。所以dump出nand上的代碼,結果是十六進制字符,所以需要轉化成二進制,進而反匯編。
按照xxd -r的格式要求,將文件轉換成必要的表面形式。使用head 或cat或tail 或sed 文件操作 | xxd -r -p 文件名
就生成二進制文件,然后反匯編。例如:
cat test | xxd -r -p >binary
或者
sed -n -e '1,10p' test | xxd -r -p > binary