文/Edward“Hex文件里面究竟存儲的是什么內容,為什么將它一頓操作后下載到單片機里面之后就可以使得單片機神奇的按照我們想要的方式工作起來呢?”好奇的你有沒有思考過這個問題?今天我們就來展開這個Hex文件的內容,一探到底,揭開它神秘的面紗。
??認識它我們一般將Hex文件稱為單片機上面的可執行文件,或者叫它十六進制文件。Hex的由來也是截取了十六進制英文“hexadecimal”的前面三個字母。其實,可以下載到單片機內部的可執行文件不止Hex文件一種,其它的還有二進制文件,elf文件等,但是不可置否的是,現在Hex文件是使用最多的單片機可執行文件格式。Hex 全稱Intel HEX文件是由一行行符合Intel HEX文件格式的文本所構成的ASCII文本文件。在Intel HEX文件中,每一行包含一個Hex記錄。這些記錄由對應機器語言碼和/或常量數據的十六進制編碼數字組成。Intel HEX文件通常用于傳輸將被存于ROM或者EPROM中的程序和數據。大多數EPROM編程器或模擬器使用Intel HEX文件。
? 打開它打開Hex文件,非常簡單,你可以使用電腦上面自帶的記事本工具打開,也可以使用我們最常用的J-flash去打開,也可以使用notepad++去打開。如圖1所示,使用記事本去打開Hex文件。圖1 記事本打開Hex文件記事本是我們所能接觸到的最方便的打開Hex文件的工具,除此之外,Notepad++也可以打開Hex文件。用Notepad++打開Hex文件,它除了可以將Hex文件的有效信息都顯示出來之外,還可以根據Hex文件約定的格式,分別高亮出不同顏色,以代表不同的字段信息。使讀者更為醒目,如圖2所示。圖2 Notepad++打開Hex文件當然最專業的打開Hex文件的工具,還是J-flash,因為它是專門用來為單片機燒寫程序的軟件。如圖3所示。圖3 J-flash打開Hex文件
問題思考1使用上面的三個軟件中的任意軟件都可以打開并且查看Hex文件。但是有好奇心強的讀者就可能會問了,圖3中右邊那一串看著像亂碼的東西到底是什么呢?上面還寫著ASCII。其實這上面表示的是Hex文件中每一個十六進制字符所對應的ASCII碼,如果這個字符對應ASCII碼的不在打印區內,就用“.”代替。
問題思考2回答到這里,可能深入思考的讀者又會有問題了,我們使用Notepad++或者記事本這樣的工具打開一個文件,它們最終會以對應的編碼去打開。比如我們打開一個文件,這個文件里面存儲了一個二進制數值0x41,那如果我們使用ASCII碼去打開,那么自然而然會將0x41的ASCII碼顯示出來。反過來說,如果我們使用Notepad++這樣子的工具去打開一個Hex文件,而它顯示了圖2的內容,那么這個Hex文件內部最終存儲的難道是這些十六進制數的ASCII碼?這個問題答案是,Hex文件是一種以文本形式存儲的文件,它不像二進制文件一樣以二進制的形式去存儲。比如同樣一串二進制數字“0500D600D2A9D28C222A”,如果將其存入二進制文件,那么它存入的勢必就是“0500D600D2A9D28C222A”這樣子的信息了。因此如果我們使用Notepad++這樣的工具去打開bin文件,必定多數都是亂碼,因為絕大多數二進制以ASCII碼打開都顯示不了。而同樣這串數字如果存入Hex文件中,其實際存儲的就是“0500D600D2A9D28C222A”的ASCII碼,如0的ASCII碼為0x30,5的ASCII碼為0x35,依次類推。因此,如果我們以后進行文件的OTA推送時,一定要注意這個問題。而由于存儲方式的不同,因此同一份程序如果用Hex文件存儲至少比用Bin文件存儲要大一倍。那么Hex文件與Bin文件相比,除了易于讀取之外,沒有很大的優點,為什么我們還要堅持不懈地使用它呢?我們知道,單片機下載程序必要的一個要素就是這個程序下載到單片機的起始地址。Bin文件是不帶有任何地址信息的,因此我們下載Bin文件的時候一定要主動地去指明這個起始地址,一旦丟失或者忘記這個地址,程序都將無法正常運行。但是Hex文件它天生就會將程序的地址信息一并記錄在內,因此使用Hex文件下載程序會變得更加方便。
? 解剖它我們還是使用Notepad++來打開Hex文件。如圖4所示。圖4 打開的Hex文件用Notepad++可以一目了然地看出這個Hex文件每一行數據中的關鍵字段。接著,我們一起來探索這個文件。首先我們需要知道,一個Hex文件的每一行都是以ASCII碼的“:”(0x31)開始的。而每一行Hex文件可以被分成五個關鍵字段,如圖5所示。圖5 Hex文件字段從圖5中可以看出,Hex文件以每一行為一個整體,定義了數據的長度,數據類型和存儲地址:第一個字節 0x02表示本行數據的長度;第二、三字節 0x00 0x00表示本行數據的起始地址;第四字節 0x04表示數據類型,數據類型有:0x00、0x01、0x02、0x03、0x04、0x05。具體的數據類型如表1所示。表1?數據類型字段中的詳細解釋
| 字段 | 名稱 | 含義 |
| '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 | 開始線性地址記錄 |
然后是數據,0x08 0x00最后一個字節 0xf2為校驗和,校驗和的算法為:計算 0xf2前所有16進制碼的累加和(不計進位),檢驗和 = 0x100 - 累加和。Hex文件的數據類型字段中,'04'? '05',都是用來提供地址信息的。每次碰到這2個記錄的時候,都可以根據記錄計算出一個“基”地址。對于后面的數據記錄,計算地址的時候,都是以這些“基”地址為基礎的。HEX文件都是由記錄(RECORD)組成的。在HEX文件里面,每一行代表一個記錄。記錄的基本格式為::020000040800F2:1000000048B6002085010008B1450008252B0108ED:10001000B9450008C1450008C945000800000000B6:00000001FF?????對上面的HEX文件進行分析:
第1條記錄的長度為02,LOAD OFFSET為0000,RECTYPE為04,說明該記錄為擴展段地址記錄。數據為0800,校驗和為F2。從這個記錄的長度和數據,我們可以計算出一個基地址,這個地址為(0x0800 << 16) = 0x0800 0000后面的數據記錄都以這個地址為基地址。
第2條記錄的長度為10(16),LOAD OFFSET為0000,RECTYPE為00,說明該記錄為數據記錄。數據為48 B6 00 20 85 01 00 08 B1 45 00 08 25 2B 01 08,共16個BYTE。這個記錄的校驗和為ED。此時的基地址為0X0800 0000,加上OFFSET,這個記錄里的16BYTE的數據的起始地址就是0x0800 0000 + 0x0000 = 0x0800 0000.
第3條記錄的長度為10(16),LOAD OFFSET為0010,RECTYPE為00,說明該記錄為數據記錄。數據為B9 45 00 08 C1 45 00 08 C9 45 00 08 00 00 00 00,共16個BYTE。這個記錄的校驗和為B6。此時的基地址為0X0800 0000,加上OFFSET,這個記錄里的16BYTE的數據的起始地址就是0x80000 + 0x0010 = 0x0800 0010.
第4條記錄的長度為00,LOAD OFFSET為0000,TYPE = 01,校驗和為FF。說明這個是一個END OF FILE RECORD,標識文件的結尾。
當我們用J-flash去下載Hex文件的時候,這個軟件也會如我們分析一樣,將整個Hex文件一行行寫入到單片機中的特定基地址的偏移值中。
總結
以上是生活随笔為你收集整理的pythone 打开文件 一行_【精品资料】用了这么多年单片机的Hex文件不懂?看这篇就够了...的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。