Is there a neat way I can view binary files as hex in Vim, and save it back to binary from the hex?
You can use the xxd
command to transform a file in Vim to hex representation, doing
:%!xxd
:
enters command-line mode, %
matches whole file as a range, !
filters that range through an external command, xxd
is that external shell command
Giving an output like this, this is split into octet count/line (octets per line may be changed with parameter -c
on xxd
command), hex representation, and text representation:
0000000: 5468 6973 2069 7320 6120 7465 7374 0a41 This is a test.A
0000010: 6e6f 7468 6572 206c 696e 650a 416e 6420 nother line.And
0000020: 7965 7420 616e 6f74 6865 720a yet another.
Once you make the changes (in the hex part), you can go back to text with -r
command on xxd, so
:%!xxd -r
This is a little rudimentary, though I like it in its simplicity and to keep in mind xxd
, which is an interesting command line tool (I don't have to do a lot of work on hex, though). You can use some recipes to handle this transformation in a more automatic way like the one described in Improved hex editing.
-
2It's an independent program that is run from the command line, and it's installed independently from vim (I've seen it in several Linux distributions that didn't install vim by default). That's a UNIX command tool for me :-P – Khelben Feb 25 '15 at 23:53
-
-
2I think it worths mentioning that after you make the changes you must go back to the normal mode before saving the changes. – kaptan Jul 26 '18 at 20:52
-
Is it possible to specify the byte order? big-endian or little-endian – Subin Sebastian Apr 30 at 9:23
Taken from :h hex-editing
:
If one has a particular extension that one uses for binary files (such as exe,
bin, etc), you may find it helpful to automate the process with the following
bit of autocmds for your <.vimrc>. Change that "*.bin" to whatever
comma-separated list of extension(s) you find yourself wanting to edit:
" vim -b : edit binary using xxd-format!
augroup Binary
au!
au BufReadPre *.bin let &bin=1
au BufReadPost *.bin if &bin | %!xxd
au BufReadPost *.bin set ft=xxd | endif
au BufWritePre *.bin if &bin | %!xxd -r
au BufWritePre *.bin endif
au BufWritePost *.bin if &bin | %!xxd
au BufWritePost *.bin set nomod | endif
augroup END
You may want to look at: How do I navigate to topics in Vim's documentation?
-
-
Maybe this is must be in
~/.vim/ftdetect/
because this is about file type detection? – Vitaly Zdanevich Nov 28 '18 at 7:36