程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 十六進制文件(HEX)轉二進制文件(BIN)小結(原)

十六進制文件(HEX)轉二進制文件(BIN)小結(原)

編輯:.NET實例教程
最近寫程序需要把HEX文件轉換成BIN文件,查找網上資料總結如下: 
先解析Intel HEX文件格式
1 Intel HEX文件是由一行行符合Intel HEX文件格式的文本所構成的ASCII文本文件。在Intel HEX文件中,每一行包含一個HEX記錄。這些記錄由對應機器語言碼和/或常量數據的十六進制編碼數字組成。 Intel HEX文件通常用於傳輸將被存於ROM或者EPROM中的程序和數據。大多數EPROM編程器或模擬器使用Intel HEX文件。
2 HEX記錄格式。Intel HEX由任意數量的十六進制記錄組成。每個記錄包含5個域, 它們按以下格式排列[:LLAAAATT[DD…]CC]。每一組字母對應一個不同的域, 每一個字母對應一個十六進制編碼的數字。每一個域由至少兩個十六進制編碼數字組成, 它們構成一個字節,像下面描述的例子:
(1):每個Intel HEX記錄都由冒號開頭。
(2)  LL 是數據長度域,它代表記錄當中數據字節(DD)的數量。
(3)  AAAA 是地址域,它代表記錄當中數據的起始地址。
(4)  TT 是代表HEX記錄類型的域,它可能是以下數據當中的一個:
a.         00 – 數據記錄(看下面第3點)
b.         01 – 文件結束記錄
c.         02 – 擴展段地址記錄(看下面第5點)
d.         04 – 擴展線性地址記錄(看下面第4點)
(5) DD… 是數據域,它兩個字符代表一個字節的數據。一個記錄可以有許多數據字節,記錄當中數據字節的數量必須和數據長度域(ll)中指定的數字相符。
(6) CC 是校驗和域,它表示這個記錄的校驗和。校驗和的計算是通過將記錄當中所有十六進制編碼數字對的值相加,以256為模進行以下補足。也就是說LLAAAATT[DD…]CC一共的校驗和永遠為0。如下面的例子:
: 0300000002005E9D
cc=0x01+NOT((0x03+0x00+0x00+0x00+0x02+0x00+0x5E)%0x100)=0x01+0x9C=0×9D
3 數據記錄格式。Intel HEX文件由任意數量以回車換行符結束的數據記錄組成.數據記錄外觀如下[:10246200464C5549442050524F46494C4500464C33],其中:
a.         10 是這個記錄當中數據字節的數量。
b.         2462 是數據將被下載到存儲器當中的地址。
c.         00 是記錄類型(數據記錄)。
d.         464C…464C是數據。
e.         33 是這個記錄的校驗和的補足碼。
4 擴展線性地址記錄(HEX386)格式。擴展線性地址記錄也叫作32位地址記錄或HEX386記錄。這些記錄包含數據地址的高16位。

$False$

擴展線性地址記錄總是有兩個數據字節,外觀如下:02000004FFFFFC],其中:
a.         02 是這個記錄當中數據字節的數量。
b.         0000 是地址域,對於擴展線性地址記錄,這個域總是0000。
c.         04 是記錄類型 04(擴展線性地址記錄)。
d.         FFFF 是地址的高16位。
e.         FC 是這個記錄的校驗和的補足碼。
f.          當一個擴展線性地址記錄被讀取,存儲於數據域的擴展線性地址被保存,它被應用於從Intel HEX文件讀取來的隨後的記錄。線性地址保持有效,直到它被另外一個擴展地址(擴展段或者擴展線性地址)記錄所改變。
g.         通過把記錄當中的地址域與被移位(16位)的來自擴展線性地址記錄的地址數據相加獲得數據記錄的絕對存儲器地址。以下的例子演示了這個過程:
                                      i.              來自數據記錄地址域的地址       2462
                                    ii.              擴展線性地址記錄的數據域    FFFF0000
                                  iii.              絕對存儲器地址                         FFFF2462
5 擴展段地址記錄(HEX86)。擴展段地址記錄也叫HEX86記錄,它包括4-19位數據地址段。擴展段地址記錄總是有兩個數據字節,外觀如下:[: 020000021200EA],其中:
a.         02 是記錄當中數據字節的數量。
b.         0000 是地址域,對於擴展段地址記錄,這個域總是0000。
c.         02 是記錄類型 02(擴展段地址記錄)。
d.         1200 是地址段。
e.         FC 是這個記錄的校驗和的補足碼。
f.          當一個擴展線性地址記錄被讀取,存儲於數據域的擴展線性地址被保存,它被應用於從Intel HEX文件讀取來的隨後的記錄。線性地址保持有效,直到它被另外一個擴展地址(擴展段或者擴展線性地址)記錄所改變。
g.         通過把記錄當中的地址域與被移位(16位)的來自擴展線性地址記錄的地址數據相加獲得數據記錄的絕對存儲器地址。以下的例子演示了這個過程:
                                      i.              來自數據記錄地址域的地址       2462
                                    ii.              擴展線性地址記錄的數據域    FFFF0
                                  iii.              絕對存儲器地址                         102452
6 程序的實現過程,程序的實現過程需要讀取兩次文件,第一次讀取文件主要是讀得文件中的最小地址和最大地址,也即可以知道HEX文件中的數據是從那個(低)地址到那個(高)地址的的數據,在這一次可以順便檢驗文件中字符的合法性和文件的合法性,為下一次讀取文件做好准備。第二次讀取主要是轉換的過程,你可以先定義一個字節數組(數組的大小為最大地址減最小地址)或者創建一個文件(文件的大小為最大地址減最小地址)然後把數組或者文件寫入0xFF(由於0x00在單片機中是有用字節)。然後開始從頭讀文件,讀得一行分析一行並寫入數組或文件。注意讀得的地址減去第一次得到的最小地址即是在文件或者數組的地址。這樣就搞定,下面我會給出一個例子。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved