HEX文件格式詳解

Hex文件是可以燒錄到MCU中,被MCU執行的一種文件格式。如果用記事本打開可發現,整個文件以行爲單位,每行以冒號開頭,內容全部爲16進制碼(以ASCII碼形式顯示)。HEX文件都是由記錄(RECORD)組成的。在HEX文件裏面,每一行代表一個記錄。記錄的基本格式爲:

Record mark“:”以冒號開頭 <0x3a>

Length數據長度(1個字節)

Load offset數據起始地址(2個字節)

Record type數據類型(1個字節)

INFO or DATA信息或數據(n個字節)

CHKSUM校驗(1個字節)

\r <0x0d>

\n <0x0a>

 

Hex文件可以按照如下的方式進行拆分來分析其中的內容:

例如“:1000080080318B1E0828092820280B1D0C280D2854”可以被看作

“0x10 0x00 0x08 0x00 0x80 0x31 0x8B 0x1E0x08 0x28 0x09 0x28 0x20 0x28 0x0B 0x1D 0x0C 0x28 0x0D 0x28 0x54”

第一個字節 0x10表示本行數據的長度;

第二、三字節 0x00 0x08表示本行數據的起始地址;

第四字節 0x00表示數據類型,數據類型有:0x000x010x020x030x040x05

'00' Data Rrecord:用來記錄數據,HEX文件的大部分記錄都是數據記錄

'01' End of File Record: 用來標識文件結束,放在文件的最後,標識HEX文件的結尾

'02' Extended Segment Address Record: 用來標識擴展段地址的記錄

'03' Start Segment Address Record:開始段地址記錄

'04' Extended Linear Address Record: 用來標識擴展線性地址的記錄

'05' Start Linear Address Record:開始線性地址記錄

然後是數據,最後一個字節 0x54爲校驗和。

校驗和的算法爲:計算0x54前所有16進制碼的累加和(不計進位),檢驗和 = 0x100 - 累加和。

 

在上面的後2種記錄,都是用來提供地址信息的。每次碰到這2個記錄的時候,都可以根據記錄計算出一個地址。對於後面的數據記錄,計算地址的時候,都是以這些地址爲基礎的。

 

每行中的數據並不是一定有的,第二個字節數據長度爲0,那麼這行就沒有數據。由於每行標識數據地址的只有2Byte,所以最大隻能到64K,爲了可以保存高地址的數據,就有了Extended Linear Address Record。如果這行的數據類型是0x04,那麼,這行的數據就是隨後數據的基地址。例如:

看個例子:

:020000040008F2

:10000400FF00A0E314209FE5001092E5011092E5A3

:00000001FF      

對上面的HEX文件進行分析:

1條記錄的長度爲02LOAD OFFSET0000RECTYPE04,說明該記錄爲擴展段地址記錄。數據爲0008,校驗和爲F2。從這個記錄的長度和數據,我們可以計算出一個基地址,這個地址爲(0x0008 << 16)。後面的數據記錄都以這個地址爲基地址。

2條記錄的長度爲1016),LOAD OFFSET0004RECTYPE00,說明該記錄爲數據記錄。數據爲FF00A0E314209FE5001092E5011092E5,共16BYTE。這個記錄的校驗和爲A3。此時的基地址爲0X80000,加上OFFSET,這個記錄裏的16BYTE的數據的起始地址就是0x80000 + 0x0004 = 0x80004

3條記錄的長度爲00LOAD OFFSET0000TYPE 01,校驗和爲FF。說明這個是一個END OF FILE RECORD,標識文件的結尾。

在上面這個例子裏,實際的數據只有16BYTEFF00A0E314209FE5001092E5011092E5,其起始地址爲0x0004.

發佈了17 篇原創文章 · 獲贊 9 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章