hex檔案分析

Sun_Shine_999發表於2018-04-17

用文字隨便開啟一個檔案都可以看到hex檔案的內容。例如:

:020000040800F2

:1000000080040020690100087101000873010008E4

:1000100000000000000000000000000000000000E0

:100020000000000000000000000000007501000852

:1000300000000000000000007701000879010008BE

“““““

“““““

“““““

:1005E0002001000800000000006CDC020000000098

:1005F00000000000010203040607080900000000D3

:04000005080000C12E

:00000001FF

上面就是一個hex檔案內容首尾的一部分資料,從內容中很明顯可以看出這不是二進位制資料。Hex檔案是用ASCII來表示二進位制的數值,十六進位制陣列成的指令或者資料,每一行就是一個hex記錄。由於微控制器執行的只能是二進位制指令和資料,而hex檔案是十六進位制數,所以燒錄器的工作必然有一個進位制轉換機制。具體機制怎麼實現暫時可以不管,知道是燒錄器處理的就行了。從這裡可以找出第二問題的答案。

hex檔案的每一行資料記錄都是以行為單位,每行從“:”(0x3a)開始,這從檔案內容可以看出。以Enter鍵結束(0x0d,0x0a),每行以換行結束。每行的資料都是由兩個字元表示一個16進位制位元組,例如第一行,:020000040800F2中的“02”表示數為0x02,“F2”就表示為0xF2。如果資料位地址時,地址高位在前低位在後。

以上面內容的第二行資料為例,進行詳細解析:

:1000000080040020690100087101000873010008E4

1、“:”表示一行的開始;

2、第1、2個字元1和0,即“0x10”表示本行包含的資料長度為16個;

3、第3、4、5、6個字元,固定這4位表示地址,即“0000”表示資料儲存的起始地址,表示在0x0000地址開始存放本行包含的16個資料。

4、第7、8個字元,固定這2位表示本行包含資料資料的型別,即“00”表示本行包含的資料為實際燒寫的資料。而資料的型別有如下幾種:

“00”表示實際資料記錄

“01”表示檔案結束記錄

“02”表示擴充套件段地址記錄

“04”表示擴充套件線性地址記錄

5、由前兩個字元“10”可知本行的資料長度位16個位元組,所有往後的32個字元就是本行包含的資料,每兩個字元表示一個位元組資料,總共有16個位元組資料。跟最前兩個字元決定的長度一致。但是這個資料的長度不是固定的,例如最後一行00000001FF,這行包含的資料長度0,沒有資料。

6、最後兩個字元為本行的校驗碼。

通過上面的幾點分析可以總結出hex檔案的每一行的格式:

<0x3a>[資料長度1Byte][資料地址2Byte][資料型別1Byte][資料nByte]

[驗證碼1Byte]<0x0d><0x0a>

校驗的演算法:

計算從(0x3a)以後的所有各位元組的和模256的餘。即各位元組二進位制算術和,不計超過256的溢位值,然後用0x100減去這個算數累加和,得出的值就是此行校驗碼。舉一個簡單的例子,如第一行020000040800F2

0x02+0x00+0x00+0x00+0x04+0x08+0x00 = 0x0E

0x100 – 0x0E = 0xF2.

相關文章