83

Is there a neat way I can view binary files as hex in Vim, and save it back to binary from the hex?

123

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.

  • 2
    It'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
  • Rephrased it to "command line tool" ;-) – Khelben Feb 26 '15 at 0:04
  • 2
    I 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
14

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?

  • This is perfect - I added it to ~/.vim/plugin/binary.vim – thom_nic Sep 6 '17 at 15:55
  • Maybe this is must be in ~/.vim/ftdetect/ because this is about file type detection? – Vitaly Zdanevich Nov 28 '18 at 7:36

Not the answer you're looking for? Browse other questions tagged or ask your own question.