Hex檔案格式解析
Hex檔案如果用特殊的程式來查看(一般記事本就可以實現)。打開後可發現,整個檔案以行為單位,每行以冒號開頭,內容全部為16進制碼(以ASCII碼形式顯示)。Hex檔案可以按照如下的方式進行拆分來分析其中的內容:
例如:
:020000040000FA , 我把它看做 0x02 0x00 0x00 0x04 0x00 0x00 0xFA
第一個 0x02 為數據長度。
緊跟著後面的0x00 0x00 為地址。
再後面的0x04為數據類型,類型共分以下幾類:
'00' Data Record//數據記錄
'01' End of File Record//檔案結束記錄
'02' Extended Segment Address Record//擴展段地址記錄
'03' Start Segment Address Record//開始段地址記錄
'04' Extended Linear Address Record//擴展線性地址記錄
'05' Start Linear Address Record//開始線性地址記錄
然後,接著0x04後面的兩個 0x00 0x00就是數據。最後一個0xFA是校驗碼。
HEX檔案的每一行都是這樣的格式:
<0x3a> |
[數據長度1Byte] |
[數據地址2Byte] |
[數據類型1Byte] |
[數據nByte] |
[校驗1Byte] |
<0x0d> |
<0x0a> |
在例如:
:1000000018F09FE518F09FE518F09FE518F09FE5C0
按照上面的數據行格式分析如下:
<0x3a> | |
[數據長度1Byte] | 10(十六進制) |
[數據地址2Byte] | 00 00 |
[數據類型1Byte] | 00 |
[數據nByte] | 18F09FE518F09FE518F09FE518F09FE5 |
[校驗1Byte] | C0 |
<0x0d> | |
<0x0a> |
每行中的數據並不是一定有的,第二個位元組數據長度為0,那么這行就沒有數據。
由於每行標識數據地址的只有2Byte,所以最大只能到64K,為了可以保存高地址的數據,就有了Extended Linear Address Record。如果這行的數據類型是0x04,那么,這行的數據就是隨後數據的基地址。例如:
:020000040004F6
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D
第一行,是Extended Linear Address Record,裡面的數據,也就是基地址是0x0004,第二行是Data Record,裡面的地址值是0x0000。那么數據18F09FE518F09FE518F09FE518F09FE5要寫入FLASH中的地址為 (0x0004 << 16) | 0x0000,也就是寫入FLASH的0x40000這個地址。同樣,第三行的數據的寫入地址為0x40010。當一個HEX檔案的數據超過7k的時候,檔案中就會出現多個Extended Linear Address Record。
End of File Record 行是每一個HEX檔案的最後一行。例如:
:00000001FF
這樣的一行數據內容是固定的,數據長度為0,地址為0。
校驗值:每一行的最後一個值為此行數據的校驗和。例如:
:1000000018F09FE518F09FE518F09FE518F09FE5C0 這行中的 0xC0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D 這行中的 0x1D
校驗和的算法為:計算從0x3A 以後(不包括0x3A)的所有各位元組的和模256的余。即各位元組二進制算術和,不計超過256的溢出值,然後用0x100減去這個算數累加和,得出得值就是此行得校驗和。