About this tool
Four containers, one pile of addressed bytes
Intel HEX, Motorola S-record and UF2 all say the same thing in three different accents: *these bytes go at this address*. A raw .bin says only the first half — it is the bytes with the addresses thrown away, which is why a BIN alone can never tell you where it belongs. Drop any of the four here and the format is worked out from the file itself: UF2 plus a newline in the first four bytes, a leading :, or an S followed by a digit. Nothing is guessed from the extension, because half the world names an S-record .hex and the other half names it .s19, .s28, .srec or .mot. If the detection is wrong for your file — a truncated header, a stripped first line — you can override it per file and the page will tell you what it thought it was looking at.
A bad checksum has two numbers, not one
Every tool that reads Intel HEX will tell you a line is broken. Very few tell you *how* broken. This one reports both bytes: the checksum written on the line, and the checksum the record's own contents produce. When those differ by a single bit you are looking at a transfer that flipped one, and when they differ by the byte count you are usually looking at a file somebody edited by hand and forgot to recompute. A malformed line also does not swallow the lines after it — line 5 failing has no effect on line 6, so one damaged record in a 200,000-line image costs you one record, not the rest of the file. Everything else that is structurally wrong is named too: data after the end-of-file record, an address record with the wrong length, a record type nobody defined.
Segments, gaps, and the bytes two files both claim
Once the records are read they collapse into segments — contiguous runs with a start address and a length — and the holes between them are shown as gaps, with the size of each. That is the picture you want before flashing anything: a bootloader at 0x0000, an application at 0x8000, and 30 KB of nothing in between that a flat BIN would have to fill with something. When one file writes the same byte twice the range is listed rather than quietly resolved. When *two* files do, the merge is refused outright and every colliding range is shown with the two file names — because the alternative, letting whichever file loaded last win, is how a bootloader disappears without anybody noticing until the board stops enumerating.
Writing it back out
Any input format converts to any output format. Intel HEX takes a bytesPerLine and can be written with or without type-04 extended-linear-address records. S-record lets you pin the address width — S1/S9 for 16-bit, S2/S8 for 24-bit, S3/S7 for 32-bit — or leave it on the narrowest form that fits the highest byte actually written. UF2 takes a payload size and a family id, and the id is checked against the published family table so a typo shows up as an unknown id rather than as a board that refuses the drag-and-drop. A flat BIN takes a fill byte for the gaps, defaulting to 0xFF because that is what erased flash reads as. All of it runs in a Web Worker inside this tab: nothing is uploaded, and the firmware you are reverse-engineering stays your business.