前言
hex轉bin檔案網上有很多現成的工具,但還是想了解下其中的資料結構跟原理
差別
hex跟bin都是程式燒寫的檔案,那他們有什麼不同呢?
首先看大小,hex檔案都會大于bin檔案,hex檔案打開可以看到一堆數字,而bin檔案隻會得到一堆亂碼。
其實bin檔案就是你程式執行檔案的二進制檔案,裡面可以看做都是機械碼,晶片可以直接運作的
hex檔案不但包含bin檔案的内容(需要自己轉),還有具體内容存放位址,程式運作開始位置等。是以我們用燒錄器燒程式都需要用hex而不是bin,因為bin沒有程式具體燒錄位址的位置。
分析
首先我們随便用記事本打開一個hex檔案,可以看到
其格式表示為:
起始 | 本行資料長度 | 偏移量 | 資料類型 | 資料 | 校驗碼 |
:(冒号) | len | load offset | type | data | checksum |
- 以行為機關,每行以冒号開頭,内容全部為16進制碼(以ASCII碼形式顯示)
其中資料類型有:0x00、0x01、0x02、0x03、0x04、0x05。
'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: 開始線性位址記錄
如上圖第一行(所有的數字兩個為一個位元組,要以16進制的方式去看。但是其存在文本是以ascii去存放的),
:020000040801F1
: 表示這一行的資料起始位
02: 表示這一行的資料有兩個位元組的長度(其中08為一個,01為一個)
0000 表示偏移值
04 表示資料類型,看上面列出的5種。04--辨別擴充線性位址的記錄,
官方文檔解釋為32位擴充線性位址記錄用于指定線性基址的位16-31
0801 表示資料内容,這裡表示具體的擴充線性位址的值為0x0801
F1 是校驗位,運算規則是 0x100 - 前面除冒号所有16進制累加和
這裡就為 0x100 - ((0x02+0x00+0x00+0x04+0x08+0x01)&0xff) = 0xf1
綜合來看,這一行表示将位址指向0x08010000的位址,後面的所有操作就會根據這個位址來存放資料。注意這裡的偏移值0000是無用的,我說的0x08010000是因為高16位為0x0801,而後面資料存放的具體低16位要看那個資料的偏移值。
看原文解釋:
分析第二行
:1000000010380120AD010108B5010108B302010853
10 表示資料長度16位元組
0000 偏移量
00 表示這是資料記錄
10380120AD010108B5010108B3020108 具體的資料(這裡的資料都是低位在前高位在後)
53 校驗
這一行表示将資料存放在基于0x08010000位址,連續16個。其中0x08010就是上面第一行定義的高16位位元組值,0000是這裡所代表的偏移值
在檔案最後的地方,還會有這麼兩行資料
:040000050801018964
:00000001FF
同樣來分析
第一個,直接看類型為05,表示開始線性位址記錄,通俗來說就是你main函數的程式入口,具體為0x08010189。大家可以去翻一下自己程式map檔案main的位址跟自己hex對比看看
第二個,直接看類型為01,表示辨別HEX檔案的結尾,看到這個就可以結束讀取hex檔案了。後面一般也不會再有内容(有也當看不到)
剩下還有資料類型02 03
02 跟 04是差不多的作用。有一點差别就是02表示16位擴充段位址記錄用于指定段基址的位4-19
03跟 05也是差不多。
所有的資料類型具體可以看hex格式詳解
根據上面整理的内容做了一份hex轉bin的程式(C語言,壓縮包包含hex格式詳解)
積分支援下載下傳(點我)
百度雲分享:
連結:https://pan.baidu.com/s/1WeddHCokAVscsDvrM6htCA
提取碼:a1b2
有疑問可以評論回報