ByteScope

Intel HEX Converter

把韌體一行一行讀開,看清楚每個位元組會落在哪個位址,再用燒錄工具要的格式寫回去。

韌體不會離開你的瀏覽器——每個檔案都在本機解析、在本機寫回。

檔案

把韌體丟進來。格式是看檔案內容判斷的,不看副檔名;判斷錯了可以逐檔手動指定。

把 .hex、.s19、.uf2 或 .bin 丟到這裡

也可以點一下選檔。檔案只在頁面裡讀,不會上傳。

還沒有檔案。丟一個韌體進來,或貼一段 HEX 文字。

這個檔案說了什麼

選中檔案的逐行結果。檢查碼對不上的行會把兩個數字都列出來:行上寫的那個,和用記錄內容重算的那個。

還沒有檔案。丟一個韌體進來,或貼一段 HEX 文字。

合併後的位址圖

所有檔案套上各自的位移後,攤在同一個位址空間裡。空隙就是攤平成二進位檔時必須填掉的那些洞。

還沒有檔案。丟一個韌體進來,或貼一段 HEX 文字。

轉檔

輸入是哪一種都能轉成任何一種。下面這些選項改的是檔案的長相,不是內容。

firmware.bin

關於這個工具

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

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 裡,什麼都不會上傳。

常見問題

為什麼轉出來的 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 裡解析,分頁一關就沒了。沒有上傳步驟、沒有帳號,這頁根本沒有伺服器端。這件事在這裡比在多數工具上更重要,因為還沒發布的韌體正是那種「別貼到線上轉檔網站」的檔案。