Is there a neat way I can view binary files as hex in Vim, and save it back to binary from the hex?
2 Answers
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.
And rembember you can also use syntax highlighting for hex editing in vim with that command:
:set ft=xxd
- 103
- 3
- 3,187
- 2
- 14
- 12
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?
- 15,854
- 1
- 36
- 45
-
-
Maybe this is must be in
~/.vim/ftdetect/because this is about file type detection? – Vitaly Zdanevich Nov 28 '18 at 07:36 -
You can add
silentto avoid "hit enter to continue", andgetposandsetposto keep the current cursor position. That way it is easy to just save and check the asc-ii code. – DrBeco Jun 27 '21 at 05:23
:hfor:%!? I could find only for:!. Using nvim. – Artyom May 18 '20 at 07:55vimadded0Ato the end of the file. So it now has a different size (+ 1 Byte). I think a hex editor should not do such things. I usedtruncate --size=-1to correct this. – mgutt Oct 16 '20 at 21:5954it would highlight theT. Similar to howhexeditdoes it. Edit: this plugin should do it. – Matthias Braun Dec 16 '20 at 20:27:set binaryprior to doing:%!xdd, to assure (at least in windows) that things like EOL chars aren't altered. E.g. for me, it was switching every0x0ainto0x0d 0x0aunless I did the:set binarystep first.Also worth noting that to make it display the more common (to me) byte-fields, do
– Gurce Oct 30 '22 at 08:27%!xdd -g 1