75

This question already has an answer here:

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

marked as duplicate by Martin Tournoij, Josh, John O'M., Doorknob, muru Feb 26 '15 at 2:59

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

109

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
13

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.