天天看點

vim+xxd=強大的十六進制編輯器

<a href="http://hi.baidu.com/hilojack/item/9cf0c307f7c03a133b53ee7a" target="_blank">http://hi.baidu.com/hilojack/item/9cf0c307f7c03a133b53ee7a</a>

vim是黑客文化中強大的編輯器。利用它調用外部十六進制檔案顯示指令xxd就可以順利的編輯二進制檔案了。

其中,%在vimComandLine時代表目前檔案的路徑,xxd是以十六進制顯示一個檔案,xxd -r&gt;是将十六進制還原為二進制。

下面舉一個例子,備份我們的MBR。

sudo dd if=/dev/sda of=~/mbr.backup bs=512 count=1

題外話:其中含有分區表,這時我們可以利用這個指令恢複我們的MBr:

sudo dd if=~/mbr.backup of=/dev/sda bs=512 count=1

sudo dd if=~/mbr.backup of=/dev/sda bs=1 count=66 seek=446(恢複分區表)

好了,這個就是我們的MBR檔案,是二進制的。

首先以二進制的方式打開它:

vim mbr.backup -b

再在vim 指令模式下輸入:

:%!xxd            #參數%指目前所編輯的檔案 

此時MBR檔案會以十六進制顯示,現在就可以編輯它了。。

========================================================

0000090: be88 7de8 1c01 be05 7cf6 c280 7448 b441  ..}.....|...tH.A

00000a0: bbaa 55cd 135a 5272 3d81 fb55 aa75 3783  ..U..ZRr=..U.u7.

00000b0: e101 7432 31c0 8944 0440 8844 ff89 4402  [email protected].

00000c0: c704 1000 668b 1e5c 7c66 895c 0866 8b1e  ....f..\|f.\.f..

00000d0: 607c 6689 5c0c c744 0600 70b4 42cd 1372  `|f.\..D..p.B..r

00000e0: 05bb 0070 eb76 b408 cd13 730d f6c2 800f  ...p.v....s.....

00000f0: 84d0 00be 937d e982 0066 0fb6 c688 64ff  .....}...f....d.

0000100: 4066 8944 040f b6d1 c1e2 0288 e888 f440  @f.D...........@

0000110: 8944 080f b6c2 c0e8 0266 8904 66a1 607c  .D.......f..f.`|

0000120: 6609 c075 4e66 a15c 7c66 31d2 66f7 3488  f..uNf.\|f1.f.4.

0000130: d131 d266 f774 043b 4408 7d37 fec1 88c5  .1.f.t.;D.}7....

0000140: 30c0 c1e8 0208 c188 d05a 88c6 bb00 708e  0........Z....p.

0000150: c331 dbb8 0102 cd13 721e 8cc3 601e b900  .1......r...`...

0000160: 018e db31 f6bf 0080 8ec6 fcf3 a51f 61ff  ...1..........a.

0000170: 265a 7cbe 8e7d eb03 be9d 7de8 3400 bea2  &amp;Z|..}....}.4...

0000180: 7de8 2e00 cd18 ebfe 4752 5542 2000 4765  }.......GRUB .Ge

0000190: 6f6d 0048 6172 6420 4469 736b 0052 6561  om.Hard Disk.Rea

00001a0: 6400 2045 7272 6f72 0d0a 00bb 0100 b40e  d. Error........

00001b0: cd10 ac3c 0075 f4c3 e3b9 76fb 0000 8001  ...

00001c0: 0100 07fe ffff 3f00 0000 499d d801 00fe  ......?...I.....

00001d0: ffff 0ffe ffff c59d d801 eb4c 6a23 0000  ...........Lj#..

00001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

00001f0: 0000 0000 0000 0000 0000 0000 0000 55aa  ..............U.

================================================================

編輯完了以後,我們需要還原為二進制檔案:

:%!xxd -r                                    #參數-r是指将目前的十六進制轉換為二進制

好了,儲存退出:

:wq

==========================================

 在linux下用vim打開jpg檔案,使用%!xxd進行16進制顯示時,檔案頭顯示為"3f3f 

3f3f 0011 0804"檔案尾端顯示為 "3f3f 

0a";而同樣的操作在windows下,就顯示為"ffd8 ffc0 0011 0804"和 "ffd9 

0a",這才是正确的jpeg檔案頭和檔案尾标志。

很蹊跷 !

初時,我以為是jpeg在windows和linux下是不同的檔案頭,後來把jpg字尾去掉,就一個純檔案,現象依舊。考慮可能不是作業系統的差異了。

重新使用ghex打開jpeg資料檢視,發現顯示正常,為"ffd8 ffc0 0011 

0804"和 "ffd9 0a",正确。

估計應該是vim的問題了。

3f的ascii碼是?,那表示vim對檔案頭、尾沒有正常解析,是不是和vim解析檔案時用的編碼格式有關系呢?

打開.vimrc配置項,屏蔽掉下面這句話:

set fileencodings=utf-8,gb2312,gbk,gb18030,ucs-bom

再用vim打開jpeg檔案,顯示"ffd8 ffc0 0011 0804"和 "ffd9 0a", 

顯示正确。

原來,為了支援識别和顯示中文,我規定了vim的fileencodings, 

當vim打開檔案時,會使用規定的編碼格式對資料進行解析,可惜jpeg的檔案頭FFD8、尾FFD9 

不是任何一個中文的編碼,vim找不到對應的中文字,就顯示為??,即:3f3f。

至此,困惑全部打開。

繼續閱讀