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

来源:互联网 发布:mac弹出u盘快捷键 编辑:程序博客网 时间:2024/05/21 09:33

转载: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  ..t21..D.@.D..D.

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩g和d不分怎么办 两岁宝宝皮肤黑怎么办 2岁宝宝肤色偏黄怎么办 2岁宝宝迷上手机怎么办 2岁宝宝说话口吃怎么办 两岁宝宝突然口吃怎么办 两岁半的宝宝还不会说话怎么办 2岁宝宝自闭症怎么办呀 新生儿又吐又拉怎么办 一岁多宝宝受凉呕吐拉稀怎么办 7个月的宝宝腹泻怎么办 两岁宝宝拉稀水怎么办 2岁宝宝发烧呕吐怎么办 1岁宝宝着凉呕吐怎么办 2岁着凉了呕吐怎么办 2岁宝宝着凉呕吐怎么办 两岁宝宝偏矮怎么办 2岁宝贝吐没精神怎么办 11个月的宝宝吐怎么办 二岁的宝宝吐了怎么办 十个月小孩吐了怎么办 10个月宝宝呕吐怎么办 小孩又拉又吐的怎么办 小孩子不吃饭呕吐拉肚子怎么办 小孩发烧后又吐怎么办 11个月宝宝吐了怎么办 11个月宝宝拉肚子怎么办 2岁宝宝反复呕吐怎么办 1岁半幼儿拉肚子怎么办 宝宝打嗝呕吐胃难受怎么办 3岁宝宝发烧还吐怎么办 孩子喝水都吐怎么办啊 宝宝吃多了呕吐怎么办 3岁宝宝吐怎么办才好 儿童受凉肚子疼发热呕吐怎么办 两岁宝宝半夜呕吐怎么办 两岁宝宝吐了怎么办 2岁宝宝发烧吐怎么办 2岁多宝宝呕吐是怎么办 2周岁宝宝中暑了怎么办 2岁半宝宝着凉呕吐怎么办