xxd

Binary to ASCII or ASCII to Binary.

xxd [options] [infile [outfile]]
xxd -r[evert] [options] [infile [outfile]]
xxd -h[elp]

Treats input as binary, creates an ASCII hex dump or convert an ASCII hex dump to binary.

> ls -log numbersAndLetters.txt
-rw-r----- 1 65 May  4  2012 numbersAndLetters.txt
> cat numbersAndLetters.txt
0123456789 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ

> xxd numbersAndLetters.txt
0000000: 3031 3233 3435 3637 3839 2061 6263 6465  0123456789 abcde
0000010: 6667 6869 6a6b 6c6d 6e6f 7071 7273 7475  fghijklmnopqrstu
0000020: 7677 7879 7a20 4142 4344 4546 4748 494a  vwxyz ABCDEFGHIJ
0000030: 4b4c 4d4e 4f50 5152 5354 5556 5758 595a  KLMNOPQRSTUVWXYZ
0000040: 0a                                       .
If infile/outfile is specified as - or if none is given stdin/stdout is used .

Only the first option letter is used, unless the option is followed by a parameter.
Spaces between a single option letter and its parameter are optional.
Parameters can be specified in decimal, hexadecimal or octal -c8, -c 8, -c 010 and -cols 8 are equivalent.

-u use upper case hex letters. Default is lower case.
> xxd -u  numbersAndLetters.txt
0000000: 3031 3233 3435 3637 3839 2061 6263 6465  0123456789 abcde
0000010: 6667 6869 6A6B 6C6D 6E6F 7071 7273 7475  fghijklmnopqrstu
0000020: 7677 7879 7A20 4142 4344 4546 4748 494A  vwxyz ABCDEFGHIJ
0000030: 4B4C 4D4E 4F50 5152 5354 5556 5758 595A  KLMNOPQRSTUVWXYZ
0000040: 0A                                       .
-plain
-p
-ps
-postscript
Output in plain hexdump . AKA postscript. > xxd -plain numbersAndLetters.txt
> xxd -plain  numbersAndLetters.txt
30313233343536373839206162636465666768696a6b6c6d6e6f70717273
7475767778797a204142434445464748494a4b4c4d4e4f50515253545556
5758595a0a
-b
-bits
binary digits dump
Each line is preceded by an address in hex and followed by ASCII (or EBCDIC).
Not with -revert, -postrscript, -include .
> xxd -bits  numbersAndLetters.txt
0000000: 00110000 00110001 00110010 00110011 00110100 00110101  012345
0000006: 00110110 00110111 00111000 00111001 00100000 01100001  6789 a
000000c: 01100010 01100011 01100100 01100101 01100110 01100111  bcdefg
0000012: 01101000 01101001 01101010 01101011 01101100 01101101  hijklm
0000018: 01101110 01101111 01110000 01110001 01110010 01110011  nopqrs
000001e: 01110100 01110101 01110110 01110111 01111000 01111001  tuvwxy
0000024: 01111010 00100000 01000001 01000010 01000011 01000100  z ABCD
000002a: 01000101 01000110 01000111 01001000 01001001 01001010  EFGHIJ
0000030: 01001011 01001100 01001101 01001110 01001111 01010000  KLMNOP
0000036: 01010001 01010010 01010011 01010100 01010101 01010110  QRSTUV
000003c: 01010111 01011000 01011001 01011010 00001010           WXYZ.
-i
-include
output in C include file style. A static array definition is written named after the input file.
> xxd -include  numbersAndLetters.txt
unsigned char numbersAndLetters_txt[] = {
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x20, 0x61,
  0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d,
  0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
  0x7a, 0x20, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
  0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
  0x57, 0x58, 0x59, 0x5a, 0x0a
};
unsigned int numbersAndLetters_txt_len = 65;
-a
-autoskip
toggle autoskip: A single * replaces nul-lines. Default off.
-c cols
-cols cols
cols octets per line.
Defaults: 16 ;-include: 12; -plain: 30, -bits: 6, max 256.
-g b
-groupsize b
Output groups of b bytes separated by whitespace.
-g 0 suppresses grouping.
Default: 2 in normal mode and 1 in bits mode.
Does not apply to plain or include .
> xxd -g 4  numbersAndLetters.txt
0000000: 30313233 34353637 38392061 62636465  0123456789 abcde
0000010: 66676869 6a6b6c6d 6e6f7071 72737475  fghijklmnopqrstu
0000020: 76777879 7a204142 43444546 4748494a  vwxyz ABCDEFGHIJ
0000030: 4b4c4d4e 4f505152 53545556 5758595a  KLMNOPQRSTUVWXYZ
0000040: 0a                  

> xxd -g 8  numbersAndLetters.txt
0000000: 3031323334353637 3839206162636465  0123456789 abcde
0000010: 666768696a6b6c6d 6e6f707172737475  fghijklmnopqrstu
0000020: 767778797a204142 434445464748494a  vwxyz ABCDEFGHIJ
0000030: 4b4c4d4e4f505152 535455565758595a  KLMNOPQRSTUVWXYZ
0000040: 0a                                 .
 
-l len
-len len
stop after writing len octets.
-s [+][-]seek Start at seek bytes offset.
+ seek is relative to the current stdin position (meaningless when not reading from stdin).
- seek should be that many characters from the end of the input With +: before the current stdin position.
Without -s start at the current position.
-E
-EBCDIC
The character encoding in the is EBCDIC.
Not with-revert, -postrscript, -include .
-r
-revert
Revert hexdump ASCII to binary. Writes into its output file without truncating it.
With -plain read dumps without addresses and without column layout.
Whitespace and line-breaks are allowed anywhere.
-seek offset With -revert: offset added to file positions found in hexdump.
-h
-help
 
Usage:
       xxd [options] [infile [outfile]]
    or
       xxd -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]
Options:
    -a          toggle autoskip: A single '*' replaces nul-lines. Default off.
    -b          binary digit dump (incompatible with -ps,-i,-r). Default hex.
    -c cols     format  octets per line. Default 16 (-i: 12, -ps: 30).
    -E          show characters in EBCDIC. Default ASCII.
    -g          number of octets per group in normal output. Default 2.
    -h          print this summary.
    -i          output in C include file style.
    -l len      stop after  octets.
    -ps         output in postscript plain hexdump style.
    -r          reverse operation: convert (or patch) hexdump into binary.
    -r -s off   revert with  added to file positions found in hexdump.
    -s [+][-]seek  start at  bytes abs. (or +: rel.) infile offset.
    -u          use upper case hex letters.
    -v          show version: "xxd V1.10 27oct98 by Juergen Weigert".

       
-v
-version
 Mac Os: xxd 2022-01-14 by Juergen Weigert et al.

Useful for transmission binary data in `mail-safe' ASCII, like uuencode. Has the advantage of decoding to standard output.

It can be used to perform binary file patching.

CAVEATS

-revert
If the output file is seekable, the adresses at the start of each hexdump line may be out of order, be missing, or overlapping. In these cases xxd will lseek to the next position.
If the output file is not seekable, only gaps are allowed, which will be filled by null-bytes.

-revert never generates parse errors. Garbage is silently skipped.

-refert skips everything on the input line after reading enough columns of hexadecimal data (see -cols). changes to the printable text columns are always ignored.
Reverting a plain hexdump with -plain does not depend on the correct number of columns.
Anything that looks like a pair of hex-digits is interpreted.

Note the difference between

xxd -include file
       and
xxd -include < file stdin

> xxd -include  numbersAndLetters.txt
unsigned char numbersAndLetters_txt[] = {
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x20, 0x61,
  0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d,
  0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
  0x7a, 0x20, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
  0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
  0x57, 0x58, 0x59, 0x5a, 0x0a
};
unsigned int numbersAndLetters_txt_len = 65;

> xxd -include < numbersAndLetters.txt
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x20, 0x61,
  0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d,
  0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
  0x7a, 0x20, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
  0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
  0x57, 0x58, 0x59, 0x5a, 0x0a
-s +seek may be different from -s seek, as lseek(2) is used to position the input.
A + makes a difference if the input source is stdin, and it's position is not at the start of the file when xxd is started and given its input.

EXAMPLES

cat stdin to plain_copy, then position stdin to the beginning (needed because the cat has read to the end of stdin).

% sh -c "cat > plain_copy; xxd -s 0 > hex_copy < file"
dd one 1K block then hexdump from file position 0x480 (=1024+128) onwards. The + means "relative to the current position", thus the `128' adds to the 1k where dd left off.
% sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +128 > hex_snippet" < file
Hexdump from file position 0x100 ( = 1024-768) on.
% sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +-768 > hex_snippet" < file
this is a rare situation and the use of `+' is rarely needed. monitor the effect of xxd with strace(1) or truss(1), whenever -s is used.

Output everything but the first three lines (hex 0x30 bytes) of file.

% xxd -s 0x30 file
Output 3 lines (hex 0x30 bytes) from the end of file.
% xxd -s -0x30 file
Output 120 bytes as continuous hexdump with 20 octets per line.
% xxd -len 120 -ps -cols 20 xxd.1
       2e54482058584420312022417567757374203139
       39362220224d616e75616c207061676520666f72
       20787864220a2e5c220a2e5c222032317374204d
       617920313939360a2e5c22204d616e2070616765
       20617574686f723a0a2e5c2220202020546f6e79
       204e7567656e74203c746f6e79407363746e7567
Hexdump the first 120 bytes of this man page with 12 octets per line.
% xxd -len 120 -cols 12 xxd.1
       0000000: 2e54 4820 5858 4420 3120 2241  .TH XXD 1 "A
       000000c: 7567 7573 7420 3139 3936 2220  ugust 1996"
       0000018: 224d 616e 7561 6c20 7061 6765  "Manual page
       0000024: 2066 6f72 2078 7864 220a 2e5c   for xxd"..\
       0000030: 220a 2e5c 2220 3231 7374 204d  "..\" 21st M
       000003c: 6179 2031 3939 360a 2e5c 2220  ay 1996..\"
       0000048: 4d61 6e20 7061 6765 2061 7574  Man page aut
       0000054: 686f 723a 0a2e 5c22 2020 2020  hor:..\"
       0000060: 546f 6e79 204e 7567 656e 7420  Tony Nugent
       000006c: 3c74 6f6e 7940 7363 746e 7567  <tony@sctnug
Display just the date from the file xxd.1
% xxd -s 0x36 -len 13 -cols 13 xxd.1
       0000036: 3231 7374 204d 6179 2031 3939 36  21st May 1996
Copy input_file to output_file and prepend 100 bytes of value 0x00.
% xxd input_file | xxd -r -s 100 > output_file
Patch the date in the file xxd.1
% echo "0000037: 3574 68"  xxd -r - xxd.1    # 3574 68  (c=  5th
       % xxd -s 0x36 -len 13 -cols 13 xxd.1
       0000036: 3235 7468 204d 6179 2031 3939 36  25th May 1996
Create a 65537 byte file with all bytes 0x00, except for the last one which is 'A' (hex 0x41).
% echo "010000: 41" | xxd -r > file

       Hexdump that file with autoskip.
       
% xxd -a -cols 12 file
       0000000: 0000 0000 0000 0000 0000 0000  ............
       *
       000fffc: 0000 0000 40                   ....A
Create a 1 byte file containing a single 'A' character. The number after '-r -s' adds to the linenumbers found in the file; in effect, the leading bytes are suppressed.
% echo "010000: 41" | xxd -r -s -0x10000 > file
Use xxd as a filter within an editor such as vim(1) to hexdump a region marked between `a' and `z'.
:'a,'z!xxd
Use xxd as a filter within an editor to recover a binary hexdump marked between `a' and `z'.
:'a,'z!xxd -r
Use xxd as a filter within an editor to recover one line of a hexdump. Move the cursor over the line and type:
!!xxd -r
Create a C include:
xxd -i samp 0000.c

    cat 0000.c
unsigned char samp[] = {
  0x20, 0x41, 0x46, 0x4b, 0x50, 0x55, 0x5a, 0x0a, 0x20, 0x42, 0x47, 0x4c,
  0x51, 0x56, 0x0a, 0x20, 0x43, 0x48, 0x4d, 0x52, 0x57, 0x0a, 0x20, 0x44,
  0x49, 0x4e, 0x53, 0x58, 0x0a, 0x20, 0x45, 0x4a, 0x4f, 0x54, 0x59, 0x3a,
  0x58, 0x0a, 0x0a
};
unsigned int samp_len = 39;
Read single characters from a serial line
% xxd -cols 1 < /dev/term/b &
       % stty < /dev/term/b -echo -opost -isig -icanon min 1
       % echo -n foo > /dev/term/b 

Return Values

       0      no errors encountered.  
      -1      operation not supported ( xxd -revert  -include) 
       1      error while parsing options.  
       2      problems with input file.  
       3      problems with output file.  
       4,5    desired seek position is unreachable.

SEE ALSO

uuencode(1), uudecode(1), patch(1)