getreadystack commited on
Commit
e9a3040
·
verified ·
1 Parent(s): e4cb9e6

Upload index.html with huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +142 -86
index.html CHANGED
@@ -2,63 +2,100 @@
2
  <html lang="en">
3
  <head>
4
  <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width,initial-scale=1">
6
- <title>Intel HEX & S-record Image Audit — free online check</title>
 
 
7
  <style>
8
- :root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512}
9
- .wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px}
10
- textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box}
11
- .bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer}
12
- input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px}
13
- table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65}
14
- .sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600}
15
- .note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  </style>
17
  <script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script>
18
- <!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/hex-image-audit"></head>
19
  <body>
20
  <div class="wrap">
21
- <h1>Intel HEX & S-record Image Audit</h1>
22
- <p class="lede">Recomputes every checksum in a .hex/.s19 firmware image and flags bad records, overlaps, gaps, missing EOF and unaligned pages before the image reaches the programmer. Runs entirely in your browser — nothing is uploaded.</p>
23
- <textarea id="src" spellcheck="false">:020000040800F2
24
- :100000000714212E3B4855626F7C8996A3B0BDCA68
25
- :100010000E1B2835424F5C697683909DAAB7C4D12A
26
- :1000200015222F3C495663707D8A97A4B1BECB40
27
- # regenerated by patch_tool.py on 2026-09-11
28
- :100030001c293643505d6a7784919eabb8c5d2dfe8
29
- :1001000023303D4A5764717E8B98A5B2BFCCD9E6A7
30
- :100110002A3744515E6B7885929FACB9C6D3E0ED27
31
- :08010800313E4B5865727F8CFB
32
- :10FFF8003845525F6C798693A0ADBAC7D4E1EEFB61
33
- :04014007DEADBEEF7C
34
- :0400000500000200F5
35
- :00000001FF
36
- :100200003F4C596673808D9AA7B4C1CEDBE8F502E6</textarea>
37
- <div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div>
38
- <div id="out" aria-live="polite"></div>
39
- <div id="paid"><strong>Free here:</strong> Audit one .hex or .s19 image end to end: every record checksum recomputed, every address range mapped, every structural defect named with its line number.. <strong>In the editor:</strong> Audit the whole build output folder in one pass and export a dated Markdown image-audit report you keep — the artefact a release or CRA technical-documentation file needs. — that part asks for a licence key.</div>
40
- <p class="note">Same engine as the VS Code extension, byte for byte.</p>
 
 
 
 
 
 
 
 
 
 
 
 
41
  </div>
42
- <script>var HEX_RULES = [
43
- {"id":"record_start","sev":"error","title":"Line is not a record","why":"Every Intel HEX line must begin with ':' and every Motorola line with 'S'. Anything else is a paste artefact, a diff marker or a stray editor line, and most programmers stop at it."},
44
- {"id":"record_hex","sev":"error","title":"Non-hex or odd-length record","why":"A record is whole bytes of uppercase-or-lowercase hex. An odd digit count or a stray character means a byte was dropped or split when the file was edited or generated."},
45
- {"id":"record_length","sev":"error","title":"Byte-count field disagrees with the data","why":"The LL field states how many data bytes follow. When a patch adds or removes bytes without fixing LL, loaders read past the end of the record or truncate it silently."},
46
- {"id":"record_checksum","sev":"error","title":"Intel HEX checksum is wrong","why":"The last byte is the two's complement of the sum of every byte before it. Hand-edited and machine-patched records almost always leave the old checksum behind; strict programmers abort, lax ones flash the record anyway."},
47
- {"id":"record_type","sev":"error","title":"Unknown Intel HEX record type","why":"Only types 00-05 are defined. An unknown type is a corrupted address field or a file from a different format, and behaviour is undefined across toolchains."},
48
- {"id":"eof_record","sev":"error","title":"Missing or malformed end-of-file record","why":"An Intel HEX image must end with :00000001FF. Without it a programmer cannot tell a complete image from a truncated download, and some simply hang waiting for more."},
49
- {"id":"data_after_eof","sev":"error","title":"Records after the end-of-file record","why":"Everything after the EOF record is ignored by conforming loaders. Appending a patch to the end of a .hex file is the classic way to ship a fix that never reaches the device."},
50
- {"id":"address_overlap","sev":"error","title":"Two records write the same address","why":"When two data records cover the same absolute byte, the flashed value depends on the load order of the tool. Merged images and appended patches are where this comes from."},
51
- {"id":"extended_address","sev":"error","title":"Address wraps past 64 KiB with no extended-address record","why":"Type 00 records carry only 16 address bits. Past 0xFFFF an image needs a type 04 or type 02 record; without one the data lands back at the bottom of memory."},
52
- {"id":"srec_checksum","sev":"error","title":"S-record checksum is wrong","why":"An S-record checksum is 0xFF minus the sum of the count, address and data bytes. A wrong one means the line was edited after generation."},
53
- {"id":"srec_count","sev":"error","title":"S-record count field or terminator is wrong","why":"The count byte covers address + data + checksum, and an S-record image must end with S7, S8 or S9. A wrong count shifts the checksum byte; a missing terminator leaves the entry point undefined."},
54
- {"id":"srec_tally","sev":"warn","title":"S5/S6 record tally does not match","why":"S5 and S6 declare how many data records the file contains. A tally that no longer matches is proof the file was cut, merged or filtered after it was built."},
55
- {"id":"address_gap","sev":"warn","title":"Unwritten gap inside the image","why":"A gap means those cells keep whatever was in flash before. If the gap is not deliberate erased space it is a section the linker placed and the image dropped."},
56
- {"id":"page_alignment","sev":"warn","title":"Block does not sit on a flash page boundary","why":"Page-programmed flash writes whole pages. A block that starts or ends mid-page forces a read-modify-write, and on parts without it the rest of the page is erased."},
57
- {"id":"start_address","sev":"warn","title":"Start address is outside the written image","why":"A type 03/05 or S7/S8/S9 record names the entry point. If it points at an address the image never writes, the device jumps into unprogrammed flash."},
58
- {"id":"case_consistency","sev":"warn","title":"Mixed-case hex digits","why":"The format allows either case, but a file that switches case mid-way is a file that two different tools have written, which is worth knowing before you trust its checksums."}
59
- ]
60
- ;</script>
61
- <script>'use strict';
 
 
62
  // Intel HEX / Motorola S-record image audit. Same file runs in Node (extension) and in the browser (free web tool).
63
  var RULES = (typeof module !== 'undefined') ? require('./rules.json') : window.HEX_RULES;
64
 
@@ -87,6 +124,7 @@ function check(text, opts) {
87
  var ela = 0, esa = 0;
88
  var eofLine = 0, seenIntel = false, seenSrec = false, srecTermLine = 0;
89
  var dataRecords = 0, tally = null, tallyLine = 0;
 
90
  var startAddr = null, startLine = 0;
91
  var fileCase = '', caseFlagged = false;
92
  var lastLine = 1;
@@ -227,6 +265,12 @@ function check(text, opts) {
227
  dataRecords++;
228
  var sdl = sb.length - 1 - alen - 1;
229
  if (sdl > 0) { claim(sa, sdl, ln); }
 
 
 
 
 
 
230
  } else if (t === '5' || t === '6') {
231
  tally = sa; tallyLine = ln;
232
  } else if (t === '7' || t === '8' || t === '9') {
@@ -244,6 +288,11 @@ function check(text, opts) {
244
  if (seenSrec && !srecTermLine) {
245
  add('srec_count', lastLine, 'the S-record image has no S7, S8 or S9 termination record, so the entry point is undefined');
246
  }
 
 
 
 
 
247
  if (tally !== null && tally !== dataRecords) {
248
  add('srec_tally', tallyLine, 'the S5/S6 record declares ' + tally + ' data record' + (tally === 1 ? '' : 's') + ' but the file contains ' + dataRecords);
249
  }
@@ -280,51 +329,58 @@ function check(text, opts) {
280
  var API = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length };
281
  if (typeof module !== 'undefined') { module.exports = API; }
282
  if (typeof window !== 'undefined') { window.HEXENGINE = API; }
283
- </script>
284
- <script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다.
285
- 'use strict';
286
- function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); }
287
- function summaryLine(res) {
288
- const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length;
289
- return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.';
290
- }
291
- function toText(res, label) {
292
- const f = (res && res.findings) || [];
293
- const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)];
294
- f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); });
295
- return lines.join('\n');
296
- }
297
- function toHtml(res) {
298
- const f = (res && res.findings) || [];
299
- if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>';
300
- const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join('');
301
- return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>';
302
- }
303
- var HEXREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml };
304
- if (typeof module !== 'undefined' && module.exports) module.exports = HEXREPORT;
305
- else window.HEXREPORT = HEXREPORT;
306
  </script>
307
  <script>
308
- (function(){
309
- var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today');
310
- today.value=new Date().toISOString().slice(0,10);
311
- function run(){ try { var res=window.HEXENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.HEXREPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } }
312
- go.onclick=run; if (src.value.trim()) run();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
313
  })();
314
  </script>
315
 
316
- <section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind Intel HEX &amp; S-record Image Audit every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"hex-image-audit",lang:"en",source:"rule_alert"})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script></section>
317
-
318
-
319
  <section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://marketplace.visualstudio.com/items?itemName=ReadyStack.hex-image-audit" rel="noopener" data-yj-install-door="mp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'mp',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">VS Code Marketplace</a><a href="https://open-vsx.org/extension/readystack/hex-image-audit" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><a href="https://www.npmjs.com/package/@readystack/hex-image-audit" rel="noopener" data-yj-install-door="npm" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'npm',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">npm</a><a href="https://www.npmjs.com/package/@readystack/hex-image-audit" rel="noopener" data-yj-install-door="mcp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'mcp',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">MCP server (npx)</a><a href="https://hub.docker.com/r/getreadystack/hex-image-audit" rel="noopener" data-yj-install-door="docker" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'docker',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Docker Hub</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">ext install ReadyStack.hex-image-audit
320
  npx @readystack/hex-image-audit &lt;file&gt;
321
- npx @readystack/hex-image-audit --mcp</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://buy.polar.sh/polar_cl_l6iN1uWt0FwWu7tBsczD0jWpP2vxFM54Wdwqb3KPi1G" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section>
322
- <section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the complete version <span class="yj-price">$29</span></h2><p style="margin:.25rem 0 1rem;color:#41505f">This page is the working piece. The full pack has everything below.</p><p style="margin:0 0 1rem;color:#41505f">Recomputes every record checksum in a .hex or .s19 firmware image and names the bad records, the overlaps, the gaps and the missing EOF by line number, before the image reaches the programme</p><p style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">Embedded firmware contract work is commonly billed at $90-$150 an hour; one hour of it costs more than this licence.</p><a href="https://buy.polar.sh/polar_cl_AkmNU5yLwVJBdRMHSvuTCQI90j52v56xJsHZH4OTDjV" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section>
323
- <section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does Intel HEX &amp; S-record Image Audit actually do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads a .hex, .ihex, .s19, .s28, .s37, .srec or .mot file and runs 16 checks over it. It recomputes the two&#x27;s-complement checksum of every Intel HEX record and the 0xFF-minus-sum checksum of every S-record, compares the byte-count field against the bytes actually present, maps every absolute address the image writes, and reports each defect with its line number.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is it for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Embedded firmware engineers and build engineers who ship a .hex or .s19 image to a flash programmer, a bootloader or a contract manufacturer. It is aimed at the moment an image is merged, hand-patched or regenerated by a script, which is where stale checksums, overlapping records and appended data after the EOF record come from.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why will a free tool not do this?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Online hex viewers render the records; they do not recompute the checksums or map the address space. A chatbot cannot verify a checksum over bytes it never sees, and it will not notice that two records in a merged image write the same absolute address. Your programmer will only tell you after it has already refused the file, at the bench.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what needs a licence?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Auditing one image is free and complete: all 16 checks, in the editor or in the browser, with no key and no truncated output. The licence adds a different job - auditing every image in a build output folder in one pass and exporting a dated Markdown audit report you keep as release evidence.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What would this cost me otherwise?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Embedded firmware contract work is commonly billed at $90 to $150 an hour, so one hour spent reading records by hand costs more than the licence. The other price is the one you pay at the flashing station: a batch programmed from an image whose records nobody recomputed.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does Intel HEX & S-record Image Audit actually do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads a .hex, .ihex, .s19, .s28, .s37, .srec or .mot file and runs 16 checks over it. It recomputes the two's-complement checksum of every Intel HEX record and the 0xFF-minus-sum checksum of every S-record, compares the byte-count field against the bytes actually present, maps every absolute address the image writes, and reports each defect with its line number."}}, {"@type": "Question", "name": "Who is it for?", "acceptedAnswer": {"@type": "Answer", "text": "Embedded firmware engineers and build engineers who ship a .hex or .s19 image to a flash programmer, a bootloader or a contract manufacturer. It is aimed at the moment an image is merged, hand-patched or regenerated by a script, which is where stale checksums, overlapping records and appended data after the EOF record come from."}}, {"@type": "Question", "name": "Why will a free tool not do this?", "acceptedAnswer": {"@type": "Answer", "text": "Online hex viewers render the records; they do not recompute the checksums or map the address space. A chatbot cannot verify a checksum over bytes it never sees, and it will not notice that two records in a merged image write the same absolute address. Your programmer will only tell you after it has already refused the file, at the bench."}}, {"@type": "Question", "name": "What is free and what needs a licence?", "acceptedAnswer": {"@type": "Answer", "text": "Auditing one image is free and complete: all 16 checks, in the editor or in the browser, with no key and no truncated output. The licence adds a different job - auditing every image in a build output folder in one pass and exporting a dated Markdown audit report you keep as release evidence."}}, {"@type": "Question", "name": "What would this cost me otherwise?", "acceptedAnswer": {"@type": "Answer", "text": "Embedded firmware contract work is commonly billed at $90 to $150 an hour, so one hour spent reading records by hand costs more than the licence. The other price is the one you pay at the flashing station: a batch programmed from an image whose records nobody recomputed."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:0,slug:"hex-image-audit",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence, 7-day refund.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/base-image-eol-lint"><span class="yj-rel-t">Base Image EOL Lint - Dockerfile and CI end-of-life check</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/dora-ict-contract-clause-lint"><span class="yj-rel-t">DORA Art. 30 ICT Contract Clause Lint</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/en301549-lint"><span class="yj-rel-t">EN 301 549 Lint — European Accessibility Act rules, with the clause number, in</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/firmware-release-gate"><span class="yj-rel-t">Firmware Release Gate for sdkconfig and prj.conf</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/linker-map-auditor"><span class="yj-rel-t">Linker Map Auditor - FLASH &amp; RAM budget for GNU ld map files</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/openapi-security-contract-lint"><span class="yj-rel-t">OpenAPI Security Contract Lint</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section><!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div>
324
 
325
 
 
 
326
  <script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script>
327
 
328
  <script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script>
329
- </body>
 
 
 
 
 
 
 
330
  </html>
 
2
  <html lang="en">
3
  <head>
4
  <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Intel HEX &amp; S-record Image Audit — free firmware image check</title>
7
+ <meta name="description" content="Paste an Intel HEX or Motorola S-record image and get all 17 checks: every checksum recomputed, every byte-count field, overlaps, gaps, page alignment and the entry point. Free, in the browser, nothing truncated.">
8
+ <link rel="canonical" href="https://getreadystack.com/tools/hex-image-audit">
9
  <style>
10
+ :root{--ink:#14181d;--mut:#5b6672;--line:#e3e7ec;--bg:#fbfcfd;--err:#b3261e;--warn:#8a6100;--ok:#1a6c3f;--acc:#12507e}
11
+ *{box-sizing:border-box}
12
+ body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.55 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}
13
+ .wrap{max-width:980px;margin:0 auto;padding:32px 20px 72px}
14
+ h1{font-size:27px;line-height:1.25;margin:0 0 6px;letter-spacing:-.01em}
15
+ .lede{color:var(--mut);margin:0 0 22px;max-width:70ch}
16
+ .panel{background:#fff;border:1px solid var(--line);border-radius:10px;padding:18px}
17
+ label{display:block;font-size:13px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--mut);margin:0 0 6px}
18
+ textarea{width:100%;height:230px;font:13px/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;padding:12px;border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink);resize:vertical}
19
+ .row{display:flex;gap:14px;align-items:flex-end;flex-wrap:wrap;margin-top:14px}
20
+ select{font:15px inherit;padding:9px 10px;border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink)}
21
+ button{font:600 15px inherit;padding:11px 20px;border:0;border-radius:8px;background:var(--ink);color:#fff;cursor:pointer}
22
+ button.ghost{background:#fff;color:var(--acc);border:1px solid var(--line);font-weight:500}
23
+ #out{margin-top:26px}
24
+ .tally{font:600 17px inherit;margin:0 0 12px}
25
+ .tally .e{color:var(--err)} .tally .w{color:var(--warn)} .tally .g{color:var(--ok)}
26
+ table{border-collapse:collapse;width:100%;font-size:14px}
27
+ th{text-align:left;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--mut);border-bottom:1px solid var(--line);padding:0 10px 7px}
28
+ td{border-bottom:1px solid var(--line);padding:9px 10px;vertical-align:top}
29
+ td.ln{font:13px ui-monospace,Menlo,Consolas,monospace;color:var(--mut);white-space:nowrap}
30
+ td.id{font:13px ui-monospace,Menlo,Consolas,monospace;white-space:nowrap}
31
+ .sev{display:inline-block;min-width:52px;font:600 11px inherit;letter-spacing:.06em;padding:2px 7px;border-radius:4px;text-align:center}
32
+ .sev.error{background:#fdecea;color:var(--err)} .sev.warn{background:#fdf3e0;color:var(--warn)}
33
+ .next{margin-top:26px;border:1px solid var(--line);border-left:3px solid var(--acc);border-radius:8px;background:#fff;padding:16px 18px}
34
+ .next p{margin:0 0 10px;color:var(--mut)} .next b{color:var(--ink)}
35
+ a.buy{display:inline-block;background:var(--acc);color:#fff;text-decoration:none;font-weight:600;padding:10px 18px;border-radius:8px}
36
+ .fine{font-size:13px;color:var(--mut);margin:10px 0 0}
37
+ footer{margin-top:34px;font-size:13px;color:var(--mut)}
38
+ footer a{color:var(--acc)}
39
  </style>
40
  <script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script>
41
+ </head>
42
  <body>
43
  <div class="wrap">
44
+ <h1>Intel HEX &amp; S-record Image Audit</h1>
45
+ <p class="lede">Paste a <code>.hex</code>, <code>.ihex</code>, <code>.s19</code>, <code>.s28</code>, <code>.s37</code>, <code>.srec</code> or <code>.mot</code> image. All <b>17 checks</b> run here in your browser — the same rules the VS Code extension runs, nothing truncated, nothing uploaded. Your image never leaves this page.</p>
46
+
47
+ <div class="panel">
48
+ <label for="img">Firmware image</label>
49
+ <textarea id="img" spellcheck="false" placeholder=":10000000...&#10;S1130000..."></textarea>
50
+ <div class="row">
51
+ <div>
52
+ <label for="page">Flash page size</label>
53
+ <select id="page">
54
+ <option value="256">256 bytes</option>
55
+ <option value="64">64 bytes</option>
56
+ <option value="128">128 bytes</option>
57
+ <option value="512">512 bytes</option>
58
+ <option value="1024">1024 bytes</option>
59
+ <option value="2048">2048 bytes</option>
60
+ </select>
61
+ </div>
62
+ <button id="run" type="button">Audit this image</button>
63
+ <button id="demo" type="button" class="ghost">Load a broken sample</button>
64
+ </div>
65
+ </div>
66
+
67
+ <div id="out"></div>
68
+
69
+ <div class="next">
70
+ <p><b>One image is free, forever, all 17 checks.</b> The licence covers the next job: sweep <b>every image in the build folder</b> in one pass and keep the dated Markdown audit report as a file you own — per-image release evidence for the technical documentation file. $29 once, one licence key per person or CI seat. A freelance firmware consultant averages $105 an hour.</p>
71
+ <a class="buy" href="https://getreadystack.com/api/buy/cl/polar_cl_AkmNU5yLwVJBdRMHSvuTCQI90j52v56xJsHZH4OTDjV">Get the full version — sweep the whole build folder, $29</a>
72
+ <p class="fine">Or install the free extension for VS Code and audit any open image at the line: <a href="https://marketplace.visualstudio.com/search?term=hex-image-audit">Intel HEX &amp; S-record Image Audit</a>.</p>
73
+ </div>
74
+
75
+ <footer>17 checks · Intel HEX record types 00&ndash;05 · S-record types S0&ndash;S9 with 16-, 24- and 32-bit addresses. Under the EU Cyber Resilience Act, Article 13(12), technical documentation is kept at the disposal of market surveillance authorities for 10 years after the product is placed on the market or for the support period, whichever is longer; the reporting obligations have been in force since 11 September 2026.</footer>
76
  </div>
77
+
78
+ <script>window.HEX_RULES = [
79
+ {"id": "record_start", "sev": "error", "title": "Line is not a record", "why": "Every Intel HEX line must begin with ':' and every Motorola line with 'S'. Anything else is a paste artefact, a diff marker or a stray editor line, and most programmers stop at it."},
80
+ {"id": "record_hex", "sev": "error", "title": "Non-hex or odd-length record", "why": "A record is whole bytes of uppercase-or-lowercase hex. An odd digit count or a stray character means a byte was dropped or split when the file was edited or generated."},
81
+ {"id": "record_length", "sev": "error", "title": "Byte-count field disagrees with the data", "why": "The LL field states how many data bytes follow. When a patch adds or removes bytes without fixing LL, loaders read past the end of the record or truncate it silently."},
82
+ {"id": "record_checksum", "sev": "error", "title": "Intel HEX checksum is wrong", "why": "The last byte is the two's complement of the sum of every byte before it. Hand-edited and machine-patched records almost always leave the old checksum behind; strict programmers abort, lax ones flash the record anyway."},
83
+ {"id": "record_type", "sev": "error", "title": "Unknown Intel HEX record type", "why": "Only types 00-05 are defined. An unknown type is a corrupted address field or a file from a different format, and behaviour is undefined across toolchains."},
84
+ {"id": "eof_record", "sev": "error", "title": "Missing or malformed end-of-file record", "why": "An Intel HEX image must end with :00000001FF. Without it a programmer cannot tell a complete image from a truncated download, and some simply hang waiting for more."},
85
+ {"id": "data_after_eof", "sev": "error", "title": "Records after the end-of-file record", "why": "Everything after the EOF record is ignored by conforming loaders. Appending a patch to the end of a .hex file is the classic way to ship a fix that never reaches the device."},
86
+ {"id": "address_overlap", "sev": "error", "title": "Two records write the same address", "why": "When two data records cover the same absolute byte, the flashed value depends on the load order of the tool. Merged images and appended patches are where this comes from."},
87
+ {"id": "extended_address", "sev": "error", "title": "Address wraps past 64 KiB with no extended-address record", "why": "Type 00 records carry only 16 address bits. Past 0xFFFF an image needs a type 04 or type 02 record; without one the data lands back at the bottom of memory."},
88
+ {"id": "srec_checksum", "sev": "error", "title": "S-record checksum is wrong", "why": "An S-record checksum is 0xFF minus the sum of the count, address and data bytes. A wrong one means the line was edited after generation."},
89
+ {"id": "srec_count", "sev": "error", "title": "S-record count field or terminator is wrong", "why": "The count byte covers address + data + checksum, and an S-record image must end with S7, S8 or S9. A wrong count shifts the checksum byte; a missing terminator leaves the entry point undefined."},
90
+ {"id": "srec_header", "sev": "warn", "title": "S-record image carries no identifiable S0 header", "why": "The S0 header record is where an S-record image states what it is: a module name (char[20]), a version and a revision inside its data field (Motorola S-record format, srec(5)). The spec makes S0 optional and plenty of toolchains emit it blank, which is harmless on the bench and expensive in the archive - an image kept as evidence cannot be tied back to the release it belongs to. Under the EU Cyber Resilience Act, Article 13(12), a manufacturer keeps the technical documentation at the disposal of market surveillance authorities for 10 years after the product is placed on the market or for the support period, whichever is longer, and the reporting obligations have been in force since 11 September 2026."},
91
+ {"id": "srec_tally", "sev": "warn", "title": "S5/S6 record tally does not match", "why": "S5 and S6 declare how many data records the file contains. A tally that no longer matches is proof the file was cut, merged or filtered after it was built."},
92
+ {"id": "address_gap", "sev": "warn", "title": "Unwritten gap inside the image", "why": "A gap means those cells keep whatever was in flash before. If the gap is not deliberate erased space it is a section the linker placed and the image dropped."},
93
+ {"id": "page_alignment", "sev": "warn", "title": "Block does not sit on a flash page boundary", "why": "Page-programmed flash writes whole pages. A block that starts or ends mid-page forces a read-modify-write, and on parts without it the rest of the page is erased."},
94
+ {"id": "start_address", "sev": "warn", "title": "Start address is outside the written image", "why": "A type 03/05 or S7/S8/S9 record names the entry point. If it points at an address the image never writes, the device jumps into unprogrammed flash."},
95
+ {"id": "case_consistency", "sev": "warn", "title": "Mixed-case hex digits", "why": "The format allows either case, but a file that switches case mid-way is a file that two different tools have written, which is worth knowing before you trust its checksums."}
96
+ ];</script>
97
+ <script>
98
+ 'use strict';
99
  // Intel HEX / Motorola S-record image audit. Same file runs in Node (extension) and in the browser (free web tool).
100
  var RULES = (typeof module !== 'undefined') ? require('./rules.json') : window.HEX_RULES;
101
 
 
124
  var ela = 0, esa = 0;
125
  var eofLine = 0, seenIntel = false, seenSrec = false, srecTermLine = 0;
126
  var dataRecords = 0, tally = null, tallyLine = 0;
127
+ var srecHeaderLine = 0, srecHeaderName = '';
128
  var startAddr = null, startLine = 0;
129
  var fileCase = '', caseFlagged = false;
130
  var lastLine = 1;
 
265
  dataRecords++;
266
  var sdl = sb.length - 1 - alen - 1;
267
  if (sdl > 0) { claim(sa, sdl, ln); }
268
+ } else if (t === '0') {
269
+ srecHeaderLine = ln;
270
+ var hd = sb.slice(1 + alen, sb.length - 1);
271
+ var htxt = '';
272
+ for (var h = 0; h < hd.length; h++) { htxt += (hd[h] >= 0x20 && hd[h] < 0x7F) ? String.fromCharCode(hd[h]) : ' '; }
273
+ srecHeaderName = htxt.replace(/\s+/g, ' ').trim();
274
  } else if (t === '5' || t === '6') {
275
  tally = sa; tallyLine = ln;
276
  } else if (t === '7' || t === '8' || t === '9') {
 
288
  if (seenSrec && !srecTermLine) {
289
  add('srec_count', lastLine, 'the S-record image has no S7, S8 or S9 termination record, so the entry point is undefined');
290
  }
291
+ if (seenSrec && !srecHeaderLine) {
292
+ add('srec_header', lastLine, 'the image has no S0 header record, so the archived file states no module name, version or revision \u2014 nothing ties it back to the release it belongs to');
293
+ } else if (seenSrec && !srecHeaderName) {
294
+ add('srec_header', srecHeaderLine, 'the S0 header record is present but its data field carries no printable module name, so the archived image is still unidentifiable');
295
+ }
296
  if (tally !== null && tally !== dataRecords) {
297
  add('srec_tally', tallyLine, 'the S5/S6 record declares ' + tally + ' data record' + (tally === 1 ? '' : 's') + ' but the file contains ' + dataRecords);
298
  }
 
329
  var API = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length };
330
  if (typeof module !== 'undefined') { module.exports = API; }
331
  if (typeof window !== 'undefined') { window.HEXENGINE = API; }
332
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
333
  </script>
334
  <script>
335
+ (function () {
336
+ 'use strict';
337
+ var SAMPLE = ":100000000102030405060708090A0B0C0D0E0F1068\n:1000100002030405060708090A0B0C0D0E0F101148\n:10002000030405060708090A0B0C0D0E0F1011122A\n:100030000405060708090A0B0C0D0E0F10111208\n<<<<<<< HEAD\n:10001000090A0B0C0D0E0F101112131415161718D8\n:1003000005060708090A0B0C0D0E0F101112131425\n:10031000060708090A0B0C0D0E0F10111213141505\n:0400000300000800F1\n:00000001FF\n:100320000708090A0B0C0D0E0F10111213141516E5";
338
+ var img = document.getElementById('img'), page = document.getElementById('page'), out = document.getElementById('out');
339
+ function esc(s) { return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'); }
340
+ function run() {
341
+ var text = img.value;
342
+ if (!text.trim()) { out.innerHTML = '<p class="tally">Paste an image above, or load the broken sample.</p>'; return; }
343
+ var res = window.HEXENGINE.engine.check(text, { page: Number(page.value) });
344
+ var f = res.findings || [];
345
+ var errs = f.filter(function (x) { return x.sev === 'error'; }).length;
346
+ var warns = f.length - errs;
347
+ var lines = text.trim().split(/\r?\n/).length;
348
+ if (!f.length) {
349
+ out.innerHTML = '<p class="tally"><span class="g">Clean.</span> ' + lines + ' lines, all ' + window.HEXENGINE.RULE_COUNT + ' checks, nothing to report.</p>';
350
+ return;
351
+ }
352
+ var rows = f.map(function (x) {
353
+ return '<tr><td class="ln">L' + x.line + '</td><td><span class="sev ' + x.sev + '">' + x.sev + '</span></td>' +
354
+ '<td class="id">' + esc(x.check) + '</td><td>' + esc(x.msg) + '</td></tr>';
355
+ }).join('');
356
+ out.innerHTML = '<p class="tally">' + lines + ' lines &middot; <span class="e">' + errs + ' error' + (errs === 1 ? '' : 's') +
357
+ '</span> &middot; <span class="w">' + warns + ' warning' + (warns === 1 ? '' : 's') + '</span> &middot; ' +
358
+ window.HEXENGINE.RULE_COUNT + ' checks run</p>' +
359
+ '<table><thead><tr><th>Line</th><th></th><th>Check</th><th>What the audit recomputed</th></tr></thead><tbody>' + rows + '</tbody></table>';
360
+ }
361
+ document.getElementById('run').addEventListener('click', run);
362
+ document.getElementById('demo').addEventListener('click', function () { img.value = SAMPLE; run(); });
363
+ page.addEventListener('change', function () { if (img.value.trim()) run(); });
364
  })();
365
  </script>
366
 
 
 
 
367
  <section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://marketplace.visualstudio.com/items?itemName=ReadyStack.hex-image-audit" rel="noopener" data-yj-install-door="mp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'mp',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">VS Code Marketplace</a><a href="https://open-vsx.org/extension/readystack/hex-image-audit" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><a href="https://www.npmjs.com/package/@readystack/hex-image-audit" rel="noopener" data-yj-install-door="npm" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'npm',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">npm</a><a href="https://www.npmjs.com/package/@readystack/hex-image-audit" rel="noopener" data-yj-install-door="mcp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'mcp',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">MCP server (npx)</a><a href="https://hub.docker.com/r/getreadystack/hex-image-audit" rel="noopener" data-yj-install-door="docker" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'hex-image-audit',src:'docker',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Docker Hub</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">ext install ReadyStack.hex-image-audit
368
  npx @readystack/hex-image-audit &lt;file&gt;
369
+ npx @readystack/hex-image-audit --mcp</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/cl/polar_cl_l6iN1uWt0FwWu7tBsczD0jWpP2vxFM54Wdwqb3KPi1G" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section>
370
+ <section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get the full rule table as a PDF</b><div style="opacity:.78;margin:.35rem 0 .8rem">All 17 rules Intel HEX &amp; S-record Image Audit checks, each with its source and date, on printable pages you can hand to your team or auditor. We email it now, and once more only if a rule changes. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Email me the PDF</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">Sent. It arrives within the hour - check spam too.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"hex-image-audit",lang:"en",source:"rule_table"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);})();</script></section>
 
371
 
372
 
373
+ <section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the complete version <span class="yj-price">$29</span></h2><p style="margin:.25rem 0 1rem;color:#41505f">This page is the working piece. The full pack has everything below.</p><p style="margin:0 0 1rem;color:#41505f">Recomputes every checksum in a .hex or .srec image and maps every address it writes, before the image reaches the programmer.</p><p style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">Freelance embedded software engineers average $104 an hour and firmware consultants $105 (contractrates.fyi, crowdsourced rates, June 2026). One hour of one of them re-reading one image costs more than this licence.</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_AkmNU5yLwVJBdRMHSvuTCQI90j52v56xJsHZH4OTDjV" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section>
374
+ <!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script>
375
  <script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script>
376
 
377
  <script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script>
378
+ <div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div><section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-09-21">Updated 2026-09-21</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-09-21","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku58659_result_card.jpg" alt="Intel HEX &amp; S-record Image Audit" loading="lazy" style="max-width:100%;border-radius:6px"></p>
379
+ <p>Eleven lines of a merged Intel HEX image came back with ten findings, six of them errors — and the build system that produced it had already called the image done. That is the whole problem an embedded firmware engineer has with .hex and .srec files: they are the one artefact in the build that nobody re-reads, because re-reading them by hand is arithmetic over thousands of records.</p>
380
+ <p>Here is what it found, verbatim. Line 3 ends in 0x2A; the recomputed two&#x27;s-complement checksum is 0x28 — a constant was hand-patched and the checksum left behind. Line 4 declares a byte count of 16 and carries 15 data bytes. Line 5 is <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code>, a merge marker inside a firmware image. Line 6 writes address 0x00000010, which line 2 already wrote, so which byte reaches the flash depends on the load order of the tool. Line 9 names an entry point of 0x00000800 that no record ever writes, so the device jumps into unprogrammed flash. Line 11 is a data record sitting after <code>:00000001FF</code>, which no conforming loader will read — the classic way to ship a fix that never reaches the device.</p>
381
+ <p>None of that is exotic. Every one of those defects is what a merge, a last-minute patch, a script-generated image or a file mailed to a contract manufacturer leaves behind. The programmer at the flashing station is where you normally find out, and by then the boards are on the bench.</p>
382
+ <p>The extension runs 17 checks. It recomputes the two&#x27;s-complement checksum of every Intel HEX record and the 0xFF-minus-sum checksum of every Motorola S-record from the record&#x27;s own bytes; it compares every byte-count field with the data present; it validates record types, S-record count bytes and terminators; and it maps every absolute address the image writes, honouring type 02 and type 04 extended-address records, so it can report overlaps, unwritten gaps, data past 0xFFFF with no extended-address record in effect, blocks that straddle a flash page, and an entry point outside the image. Findings land in the Problems panel at their line.</p>
383
+ <p>The seventeenth check is new this month and it is not about the bench at all. An S-record image can carry an S0 header record naming the module (char[20]), its version and its revision. The format makes S0 optional and plenty of toolchains emit it blank — harmless while the image is on your desk, expensive once it is in an archive, because nothing ties the file back to the release it belongs to. Under the EU Cyber Resilience Act, Article 13(12), a manufacturer keeps the technical documentation at the disposal of market surveillance authorities for 10 years after the product is placed on the market or for the support period, whichever is longer, and the reporting obligations have been in force since 11 September 2026. An unidentifiable image is a record you cannot produce.</p>
384
+ <p>Auditing one image is free and complete: all 17 checks, no key, nothing truncated, no watermark and no counter, either in VS Code or in the browser, where the same rules run on your machine and the image is never uploaded. The licence buys a different job, not more checks: sweeping every matching image in the build folder in one pass and writing a dated Markdown audit report you keep as release evidence. The first sweep runs free for seven days, whole, so the report exists before the question of paying does.</p>
385
+ <p>Freelance embedded software engineers average $104 an hour and firmware consultants $105, on crowdsourced rates collected through June 2026. One hour of one of them re-reading one image costs more than the licence, which is $29 once, per person or CI seat, with a 7-day full refund.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku58659_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku58659_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does the Intel HEX &amp; S-record Image Audit actually do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads a .hex, .ihex, .s19, .s28, .s37, .srec or .mot file and runs 17 checks over it. It recomputes every Intel HEX and S-record checksum from the record&#x27;s own bytes, compares every byte-count field with the data present, and maps every absolute address the image writes to find overlaps, gaps, page-straddling blocks and a stray entry point.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is the Intel HEX &amp; S-record Image Audit for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Embedded firmware and release engineers who produce or receive .hex and S-record images: anyone who merges a bootloader with an application image, hand-patches a constant at the last minute, regenerates an image from a script, or mails one to a contract manufacturer. Also for whoever now archives each shipped image as a dated record for an EU market.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why is srec_cat or objcopy not enough?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">They read these formats and will tell you a file is malformed, but they generally stop at the first record they cannot parse and hand you a parse error, not a list. They do not name every bad record, overlap, gap and page-straddling block at its line, and they leave you no dated report to archive.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what needs a licence?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Auditing one image is free and complete: all 17 checks, no key, nothing truncated, no watermark, no trial counter, in the editor or in the browser. The licence covers a different job — sweeping every image in the build folder in one pass and writing a dated Markdown report you keep. The first sweep runs free for seven days.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What would reviewing an image by hand cost instead?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Freelance embedded software engineers average $104 an hour and firmware consultants $105, on crowdsourced rates collected through June 2026. Reading one merged image record by record is an hour of that, and it is an hour nobody budgets, which is why the image ships unread. The licence is $29 once.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just ask ChatGPT or another AI chat?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Intel HEX &amp; S-record Image Audit checks the file you open against 17 rules from a rule set dated 2026-09-21, and points at the exact line. For a filing, an audit or a client you need that dated result on your own files.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does the Intel HEX & S-record Image Audit actually do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads a .hex, .ihex, .s19, .s28, .s37, .srec or .mot file and runs 17 checks over it. It recomputes every Intel HEX and S-record checksum from the record's own bytes, compares every byte-count field with the data present, and maps every absolute address the image writes to find overlaps, gaps, page-straddling blocks and a stray entry point."}}, {"@type": "Question", "name": "Who is the Intel HEX & S-record Image Audit for?", "acceptedAnswer": {"@type": "Answer", "text": "Embedded firmware and release engineers who produce or receive .hex and S-record images: anyone who merges a bootloader with an application image, hand-patches a constant at the last minute, regenerates an image from a script, or mails one to a contract manufacturer. Also for whoever now archives each shipped image as a dated record for an EU market."}}, {"@type": "Question", "name": "Why is srec_cat or objcopy not enough?", "acceptedAnswer": {"@type": "Answer", "text": "They read these formats and will tell you a file is malformed, but they generally stop at the first record they cannot parse and hand you a parse error, not a list. They do not name every bad record, overlap, gap and page-straddling block at its line, and they leave you no dated report to archive."}}, {"@type": "Question", "name": "What is free and what needs a licence?", "acceptedAnswer": {"@type": "Answer", "text": "Auditing one image is free and complete: all 17 checks, no key, nothing truncated, no watermark, no trial counter, in the editor or in the browser. The licence covers a different job — sweeping every image in the build folder in one pass and writing a dated Markdown report you keep. The first sweep runs free for seven days."}}, {"@type": "Question", "name": "What would reviewing an image by hand cost instead?", "acceptedAnswer": {"@type": "Answer", "text": "Freelance embedded software engineers average $104 an hour and firmware consultants $105, on crowdsourced rates collected through June 2026. Reading one merged image record by record is an hour of that, and it is an hour nobody budgets, which is why the image ships unread. The licence is $29 once."}}, {"@type": "Question", "name": "Why not just ask ChatGPT or another AI chat?", "acceptedAnswer": {"@type": "Answer", "text": "A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. Intel HEX & S-record Image Audit checks the file you open against 17 rules from a rule set dated 2026-09-21, and points at the exact line. For a filing, an audit or a client you need that dated result on your own files."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:58659,slug:"hex-image-audit",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/firmware-release-gate"><span class="yj-rel-t">Firmware Release Gate for sdkconfig and prj.conf</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/base-image-eol-lint"><span class="yj-rel-t">Base Image EOL Lint - Dockerfile and CI end-of-life check</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/cbpr-address-lint"><span class="yj-rel-t">CBPR+ Structured Address Lint</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/consent-proof-record-lint"><span class="yj-rel-t">Consent Proof Record Lint (GDPR Art.7)</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/dora-ict-contract-clause-lint"><span class="yj-rel-t">DORA Art. 30 ICT Contract Clause Lint</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/play-release-blocker-lint"><span class="yj-rel-t">Google Play Release Blocker Lint - target API 36, Billing 8, 16 KB</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section></body>
386
  </html>