tools:vim以16進制打開和編輯文件

先用vim以二進制格式打開需要編輯或查看的文件,不採用-b參數有時會導致轉換錯誤,詳見分隔線後部分。

vim -b file-to-open.dat

然後用xxd把文件轉換成十六進制格式

:%!xxd

轉化後顯示類似如下

1

2

3

4

5

6

0000000: 5036 0a35 3932 2033 3230 0a32 3535 0a20  P6.592 320.255.

0000010: 190e 2019 0e20 190e 2019 0e20 190e 2019  .. .. .. .. .. .

0000020: 0e20 190e 2019 0e1f 180c 1f18 0c1f 180c  . .. ...........

0000030: 1f18 0c1f 180c 1f18 0c1f 180c 1f18 0c27  ...............'

0000040: 1b0d 261a 0c24 1b0e 2319 0d22 180e 2017  ..&..$..#..".. .

0000050: 0c1f 180c 1e16 0b25 1d16 251d 1620 1a13  .......%..%.. ..

 


 

現在就可以對待普通文本一樣查看和編輯二進制文件了。

修改十六進制內容是不會導致右側字符改變;其實右側的文本只是給你參考的,修改了再將十六進制轉換回二進制,這些修改都會忽略。

修改完成使用xxd把十六進制轉換回二進制:

:%!xxd -r

只有十六進制的修改會生效。

****************分**********隔**********線****************

 VIM顯示十六進制出錯

在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。

至此,困惑全部打開。

分隔線後部分轉自 http://www.cnblogs.com/lidp/archive/2009/06/26/1697873.html

 

 

 

另外我們可以使用hexdump去查看對應文件的16進制值

maze@maze-VirtualBox:/mnt/share_windows/display-test$ cat b.txt 
abcd
maze@maze-VirtualBox:/mnt/share_windows/display-test$ cat b.txt |hexdump 
0000000 6261 6463 000a                         
0000005
需要注意,這個時候左邊高位,右邊是低位;

我們在使用vim以16進制讀寫的時候,左邊是低位,右邊是高位!

 

 RGB格式的圖像存儲的順序,並非像字面的順序,而是以:B、G、R的順序進行存儲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章