tools vim以16進製制開啟和編輯檔案

2021-10-07 16:26:06 字數 2232 閱讀 8554

先用vim以二進位制格式開啟需要編輯或檢視的檔案,不採用-b引數有時會導致轉換錯誤,詳見分隔線後部分。

vim -b file-to-open.dat

然後用xxd把檔案轉換成十六進製制格式

:%!xxd

轉化後顯示類似如下

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。

至此,困惑全部開啟。

分隔線後部分** 

另外我們可以使用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進製制讀寫的時候,左邊是低位,右邊是高位!

注意在使用hexdump,一定要接-c。這樣才是小端方式顯示資料內容

rgb格式的影象儲存的順序,並非像字面的順序,而是以:b、g、r的順序進行儲存。

進製轉換 以常見的二進位制,8進製,16進製制舉例

二進位制數里沒有2 比如 1001 錯誤示例 12 8進製數里沒有8 比如 249,錯誤示例 18 10進製裡也沒有十 注意 這裡指的 沒有 是指沒有單個位數的乙個數,我們常見的10 實際上因為到了9以後逢10,然後進了一位,從一位數的9 變成了 1 0 兩位數,並沒有單獨表示10的這麼乙個數 16...

16進製制位址進製

16進製制 1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 乙個位址表示乙個byte,即8bit 0x8000000033221100 77665544 bbaa9988 ffeeddcc 0x8000001076543210 0x80000000 00000000 0x80000001...

UIColor的16進製制色值,16進製制字串擴充套件

inte ce uicolor hex 16進製制字串轉化為顏色 param hexstr 16進製制字串 支援 0x.0x.return uicolor uicolor colorwithhexstring nsstring hexstr 16進製制字串轉化為顏色 param hexstr 16進...