vim+xxd=强大的十六进制编辑器

转载:http://hi.baidu.com/132811/blog/item/1cae933125648b09ebc4afd4.html

vim是黑客文化中强大的编辑器。利用它调用外部十六进制文件显示命令xxd就可以顺利的编辑二进制文件了。
其中,%在vimComandLine时代表当前文件的路径,xxd是以十六进制显示一个文件,xxd -r>是将十六进制还原为二进制。
下面举一个例子,备份我们的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  &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  ...<.u....v.....

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

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

VIM显示十六进制出错 出处:http://www.cnblogs.com/lidp/archive/2009/06/26/1697873.html

 
在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。
至此,困惑全部打开。
 


你可能感兴趣的:(c,linux,windows,vim)