I've been tinkering on a 6502 project during the evenings spread over the last 3 months (via the excellent Ben Eater series) and in doing so I've started to build up a series of tools I use with binary.
(This post is probably only useful for future Remy)
UK EVENTAttend ffconf.org 2024
The conference for people who are passionate about the web. 8 amazing speakers with real human interaction and content you can't just read in a blog post or watch on a tiktok!
£249+VAT - reserve your place today
I should add that I'm not sure how much of this will work on different systems and availability of tools, but I'll link where possible.
hexdump
hexdump - usually with hexdump -C file.bin
to view hex and ascii output. Also compresses repeating patterns seen below where the line is simply *
.
Really simple to use tool for viewing source hex on the command line.
hexdump -C rom.bin
00000000 a9 ff 8d 02 60 a9 55 8d 00 60 a9 aa 8d 00 60 4c |....`.U..`....`L|
00000010 05 80 ea ea ea ea ea ea ea ea ea ea ea ea ea ea |................|
00000020 ea ea ea ea ea ea ea ea ea ea ea ea ea ea ea ea |................|
*
00007ff0 ea ea ea ea ea ea ea ea ea ea ea ea 00 80 ea ea |................|
00008000
xxd
xxd can dump hex from binary, but also convert hex to binary.
This is used for dumping the entire hex content out. It also has a revert feature that lets me generate binary files from strings of hex. I've been doing a bit of work around unpacking old file formats, and generating snippet of binary data is useful.
Below you can see my generating a binary snippet for a ZX Spectrum+ .bas file header. The first column needs to be the offset (0
in this case).
echo "0 504c 5553 3344 4f53 1a01 00e7 0000 00" | xxd -r | hexdump -C
00000000 50 4c 55 53 33 44 4f 53 1a 01 00 e7 00 00 00 |PLUS3DOS.......|
0000000f
I could capture this output using … | xxd -r > out.bin
and then process the binary elsewhere.
diffing binary / diffing hex
Using xxd
above, I can combine diff tools to identify changes between binary (typically where I've got a typo and generated a slightly different file).
$ diff -u <(xxd -c 32 a.bin) <(xxd -c 32 b.bin) | diff-so-fancy
I'm adding diff-so-fancy into the mix to clearly highlight the changes in the file (the diff -u
flag is needed to make this work properly).
In the diff above I can clearly see that the first block starts to match, but the does not.
Honourable mentions
- od - very similar to
hexdump
and the tool I used to use to debug text files for rogue characters - strings - a great little goto when I'm looking for text inside binary files