# Intel HEX Converter

> Intel HEX、Motorola S-record、UF2 與純 BIN 互轉，附段落位址圖、逐行檢查碼比對，還能合併多個檔案。全部在瀏覽器裡跑，不上傳。

- URL: https://bytescope.dev/zh-Hant/intel-hex-converter/
- Locale: zh-Hant · Also: [en](https://bytescope.dev/en/intel-hex-converter.md) · [ja](https://bytescope.dev/ja/intel-hex-converter.md)
- Runs: 韌體不會離開你的瀏覽器——每個檔案都在本機解析、在本機寫回。
- Requires: Any modern browser (Chrome, Edge, Firefox, Safari), desktop and mobile.
- Updated: 2026-09-08

## What it does

### 四種容器，裝的都是「帶位址的位元組」

Intel HEX、Motorola S-record 和 UF2 講的其實是同一句話：*這些位元組要放在這個位址*。純 `.bin` 只有前半句，位址被丟掉了，所以光看一個 BIN 沒有人知道它該去哪裡。這四種丟進來都行，格式是從檔案內容本身判斷的：開頭四個位元組是不是 `UF2` 加一個換行、行首是不是 `:`、`S` 後面接的是不是數字。副檔名一概不看，因為有人把 S-record 取名叫 `.hex`，也有人叫 `.s19`、`.s28`、`.srec`、`.mot`。萬一判斷錯了——標頭被截掉、第一行被砍掉——你可以逐檔手動指定，頁面也會告訴你它原本以為那是什麼。

### 檢查碼對不上時，要看的是兩個數字

會讀 Intel HEX 的工具都會說「這行壞了」，但很少有工具告訴你是*怎麼*壞的。這裡會把兩個位元組並排：行上寫的那個檢查碼，和用這筆記錄的內容重算出來的那個。差一個位元，通常是傳輸過程翻了一位；差的剛好是位元組數，通常是有人手改過檔案卻忘了重算。壞掉的一行也不會吃掉後面的行——第 5 行掛掉跟第 6 行完全無關，所以二十萬行的映像檔裡壞一筆記錄，你損失的就只有那一筆。其他結構性的問題也一樣都會點名：EOF 記錄後面還有資料、長度不對的位址記錄、沒人定義過的記錄型別。

### 段落、空隙，還有兩個檔案搶同一批位元組

記錄讀完之後會收攏成段落，也就是有起始位址和長度的連續區塊，中間的洞則列成空隙並標出各自大小。燒錄前你要看的就是這張圖：`0x0000` 是開機載入程式、`0x8000` 是應用程式，中間 30 KB 什麼都沒有，而攤平成 BIN 就得拿東西把它填滿。同一個檔案自己重複寫到同一個位元組時，那段範圍會被列出來，不會被安靜地和稀泥。換成*兩個*檔案搶同一段，整批合併會直接被拒絕，每個撞到的區間都連兩個檔名一起列出來——因為另一個選項是讓後載入的那個贏，而那正是開機載入程式無聲消失、直到板子不會開機才有人發現的走法。

### 再寫回檔案

任何輸入格式都能轉成任何輸出格式。Intel HEX 可以設定每行幾個位元組，也能選要不要寫 type-04 擴充線性位址記錄。S-record 可以釘死位址寬度（16 位元用 `S1`/`S9`、24 位元用 `S2`/`S8`、32 位元用 `S3`/`S7`），不指定就挑「裝得下實際最高那個位元組」的最窄形式。UF2 要填 payload 大小和 family id，id 會去對公開的 family 表，所以打錯會變成「未知的 id」跳出來，而不是變成板子默默無視你拖進去的檔案。攤平成 BIN 則要指定空隙的填充位元組，預設 `0xFF`，因為抹乾淨的快閃記憶體讀起來就是這個值。整套都跑在這個分頁的 Web Worker 裡，什麼都不會上傳。

## Limits

Does not flash a device (use esp-flasher or avr-uploader), does not disassemble or edit the code inside an image, and refuses to merge files that write the same address rather than letting one win.

## FAQ

### 為什麼轉出來的 BIN 比原本的 HEX 大這麼多？

因為攤平的二進位檔沒有位址這種東西。如果你的映像檔在 `0x0000` 寫 4 KB、在 `0x0800_0000` 又寫 4 KB，BIN 就得把中間整段也裝進去——大小取決於跨度，不是內容量。轉檔前段落位址圖就會把空隙和各自大小攤給你看，真的要配置很大的檔案時頁面也會先問一次。如果跨度出乎意料，通常是有一筆脫隊的記錄把幾個位元組丟到很遠的地方，段落表裡會看到它自成一個很小的段落。

### 純 BIN 檔要填什麼位址？

填你的燒錄工具原本會寫進去的那個位址，因為檔案自己不知道。這裡 BIN 一律先放在 `0`，真正的載入位址由你在它的位移欄位補上：STM32 內建快閃記憶體是 `0x08000000`，常見的 ESP32 應用程式是 `0x10000`，開機載入程式是 `0x0`。填錯了也不會是那種很難察覺的錯——接著轉成 Intel HEX，每一行的位址會立刻告訴你有沒有落在你想的地方。

### 為什麼開機載入程式和應用程式合併不起來？

因為兩邊至少有一個位元組寫在同一個位址上，而「該讓誰贏」這件事沒有正確答案。撞到的區間會連同兩個檔名和確切位址列出來；原因通常是其中一份用錯了 linker script，或是應用程式那份還帶著一份中斷向量表。把重疊修掉，或用位移欄位把其中一個檔案挪開，合併就會過。內容完全一樣的重疊照樣拒絕，因為「同一個東西的兩次建置寫了同樣的位元組」是你會想知道的事，不是該被抹平的事。

### UF2 的 family id 該填哪一個？

填你的開機載入程式在等的那個：RP2040 是 `0xE48BFF56`、ESP32 是 `0x1C5F21B0`、SAMD21 是 `0x68ED2B88`、SAMD51 是 `0x55114460`、nRF52 是 `0x1B57745F`、STM32F4 是 `0x57755A57`。你填的值會拿去對整張公開表。完全不帶 family id 的 UF2 也是合法的，flags 為 0 就是這個狀態。如果板子對你拖進去的 UF2 毫無反應，第一個要查的就是 id 填錯或沒填。

### 我的韌體會被傳到哪裡去嗎？

不會。檔案用 File API 讀進來，在這個分頁的 Web Worker 裡解析，分頁一關就沒了。沒有上傳步驟、沒有帳號，這頁根本沒有伺服器端。這件事在這裡比在多數工具上更重要，因為還沒發布的韌體正是那種「別貼到線上轉檔網站」的檔案。

## Related tools

- [ESP Firmware Flasher](https://bytescope.dev/zh-Hant/esp-flasher.md) — 把轉好的內容透過 USB 燒進 ESP32 或 ESP8266。
- [AVR / Arduino Uploader](https://bytescope.dev/zh-Hant/avr-uploader.md) — 用序列開機載入程式把 Intel HEX 送進 Arduino 或 AVR 板子。
- [Hex Viewer / Editor](https://bytescope.dev/zh-Hant/hex-editor.md) — 把原始位元組打開，找到要改的欄位直接改。
- [CRC Calculator](https://bytescope.dev/zh-Hant/crc-calculator.md) — 查出映像檔尾巴那串檢查碼到底是哪個演算法算出來的。
