二進位制檔案 英文:Binaryfiles-包含在ASCII及擴充套件ASCII字元中編寫的資料或程式指令的檔案。計算機檔案基本上分為二種:二進位制檔案和ASCII(也稱純文字)檔案,圖形檔案及文字處理程式等計算機程式都屬於二進位制檔案。這些檔案含有特殊的格式及計算機程式碼。ASCII則是可以用任何文字處理程式閱讀的簡單文字檔案。 廣義的二進位制檔案即指檔案,由檔案在外部裝置的存放形式為二進位制而得名。狹義的二進位制檔案即除文字檔案以外的檔案。文字檔案是一種由很多行字元構成的計算機檔案。文字檔案存在於計算機系統中,通常在文字檔案最後一行放置檔案結束標誌。文字檔案的編碼基於字元定長,譯碼相對要容易一些;二進位制檔案編碼是變長的,靈活利用率要高,而譯碼要難一些,不同的二進位制檔案譯碼方式是不同的。 從本質上來說他們之間沒有什麼區別,因為他們在硬碟上都有一種的存放方式--二進位制,但是如果要對他們有些區分的話,那可以這樣理解。我們現在的每個字元由一個或多個位元組組成,每個位元組都是用的-128—127之間的部分數值來表示的,也就是說,-128——127之間還有一些資料沒有對應任何字元的任何位元組。如果一個檔案中的每個位元組的內容都是可以表示成字元的資料,我們就可以稱這個檔案為文字檔案,可見,文字檔案只是二進位制檔案中的一種特例,為了與文字檔案相區別,人們又把除了文字檔案以外的檔案稱為二進位制檔案,由於很難嚴格區分文字檔案和二進位制檔案的概念,所以我們可以簡單地認為,如果一個檔案專門用於儲存文字字元的資料,沒有包含字元以外的其他資料,我們就稱之為文字檔案,除此之外的檔案就是二進位制檔案。
IntelHEX檔案是由一行行符合IntelHEX檔案格式的文字所構成的ASCII文字檔案。在IntelHEX檔案中,每一行包含一個HEX記錄。這些記錄由對應機器語言碼和/或常量資料的十六進位制編碼數字組成。IntelHEX檔案通常用於傳輸將被存於ROM或者EPROM中的程式和資料。大多數EPROM程式設計器或模擬器使用IntelHEX檔案。
記錄格式
IntelHEX由任意數量的十六進位制記錄組成。每個記錄包含5個域,它們按以下格式排列:
:llaaaatt[dd...]cc
每一組字母對應一個不同的域,每一個字母對應一個十六進位制編碼的數字。每一個域由至少兩個十六進位制編碼數字組成,它們構成一個位元組,就像以下描述的那樣:
:每個IntelHEX記錄都由冒號開頭.
它代表記錄當中資料位元組(dd)的數量。
它代表記錄當中資料的起始地址。
它可能是以下資料當中的一個:
00–資料記錄
01–檔案結束記錄
02–擴充套件段地址記錄
04–擴充套件線性地址記錄
它代表一個位元組的資料。一個記錄可以有許多資料位元組.記錄當中資料位元組的數量必須和資料長度域(ll)中指定的數字相符。
它表示這個記錄的校驗和。校驗和的計算是透過將記錄當中所有十六進位制編碼數字對的值相加,以256為模進行以下補足。
IntelHEX檔案由任意數量以回車換行符結束的資料記錄組成。資料記錄外觀如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10是這個記錄當中資料位元組的數量。
2462是資料將被下載到儲存器當中的地址。
00是記錄型別(資料記錄)
464C…464C是資料。
33是這個記錄的校驗和。
擴充套件線性地址記錄也叫作32位地址記錄或HEX386記錄。這些記錄包含資料地址的高16位。擴充套件線性地址記錄總是有兩個資料位元組,外觀如下:
:02000004FFFFFC
02是這個記錄當中資料位元組的數量。
0000是地址域,對於擴充套件線性地址記錄,這個域總是0000。
04是記錄型別04(擴充套件線性地址記錄)
FFFF是地址的高16位。
FC是這個記錄的校驗和,計算方法如下:
01h+NOT(02h+00h+00h+04h+FFh+FFh).
當一個擴充套件線性地址記錄被讀取,儲存於資料域的擴充套件線性地址被儲存,它被應用於從IntelHEX檔案讀取來的隨後的記錄。線性地址保持有效,直到它被另外一個擴充套件地址記錄所改變。
透過把記錄當中的地址域與被移位的來自擴充套件線性地址記錄的地址資料相加獲得資料記錄的絕對儲存器地址。
來自資料記錄地址域的地址2462
擴充套件線性地址記錄的資料域+FFFF
------------
絕對儲存器地址FFFF2462
擴充套件段地址記錄(HEX86)
擴充套件段地址記錄也叫HEX86記錄,它包括4-19位資料地址段。擴充套件段地址記錄總是有兩個資料位元組,外觀如下:
:020000021200EA
02是記錄當中資料位元組的數量。
0000是地址域.對於擴充套件段地址記錄,這個域總是0000。
02是記錄型別02(擴充套件段地址記錄)
1200是地址段。
EA是這個記錄的校驗和,計算方法如下:
01h+NOT(02h+00h+00h+02h+12h+00h).
當一個擴充套件段地址記錄被讀取,儲存於資料域的擴充套件段地址被儲存,它被應用於從IntelHEX檔案讀取來的隨後的記錄。段地址保持有效,直到它被另外一個擴充套件地址記錄所改變。
透過把記錄當中的地址域與被移位的來自擴充套件段地址記錄的地址資料相加獲得資料記錄的絕對儲存器地址。
以下的例子演示了這個過程
擴充套件段地址記錄資料域+1200
---------
絕對儲存器地址00014462
檔案結束(EOF)記錄
IntelHEX檔案必須以檔案結束(EOF)記錄結束.這個記錄的記錄型別域的值必須是01.EOF記錄外觀總是如下:
:00000001FF
00是記錄當中資料位元組的數量.
0000是資料被下載到儲存器當中的地址.在檔案結束記錄當中地址是沒有意義被忽略的.0000h是典型的地址.
01是記錄型別01(檔案結束記錄)
FF是這個記錄的校驗和,計算方法如下:
01h+NOT(00h+00h+00h+01h).
IntelHEX檔案例子:
下面是一個完整的IntelHEX檔案的例子:
:10001C00AD071FED600BE4FEEEC3947850F20E803A
:01002C00F7DC
:01002D0022B0
:100003007CFE8C807FFA12001C7801AF04EF08801D
:090013000123D8FDFCF58080EB0F
:0300000002002ECD
:0C002E00787FE4F6D8FD7581070200031E
(PS:這是51微控制器“LED流水燈程式”的hex檔案)
HEX檔案和BIN檔案是我們經常碰到的兩種檔案格式。下面簡單介紹一下這兩種檔案格式的區別:
HEX檔案是包括地址資訊的,而BIN檔案格式只包括了資料本身
在燒寫或下載HEX檔案的時候,一般都不需要使用者指定地址,因為HEX檔案內部的資訊已經包括了地址。而燒寫BIN檔案的時候,使用者是一定需要指定地址資訊的。
BIN檔案格式對二進位制檔案而言,其實沒有”格式”。
檔案只是包括了純粹的二進位制資料。
HEX檔案格式HEX檔案都是由記錄(RECORD)組成的。
在HEX檔案裡面,每一行代表一個記錄。
+---------------------------------------------------------------+|RECORD|RECLEN|LOAD|RECTYPE|INFOorDATA|CHKSUM||MARK":"||OFFSET||||+---------------------------------------------------------------+|1-byte|1-byte|2-byte|1-byte|n-byte|1-byte|+---------------------------------------------------------------+
"00"DataRrecord:用來記錄資料,HEX檔案的大部分記錄都是資料記錄"01"EndofFileRecord:用來標識檔案結束,放在檔案的最後,標識HEX檔案的結尾"04"ExtendedLinearAddressRecord:用來標識擴充套件線性地址的記錄"02"ExtendedSegmentAddressRecord:用來標識擴充套件段地址的記錄在上面的後2種記錄,都是用來提供地址資訊的。每次碰到這2個記錄的時候,都可以根據記錄計算出一個“基”地址。對於後面的資料記錄,計算地址的時候,都是以這些“基”地址為基礎的。
+---------------------------------------------------------------+|RECORD|RECLEN|LOAD|RECTYPE|INFOorDATA|CHKSUM||MARK":"||OFFSET|"00"|||+---------------------------------------------------------------+|1-byte|1-byte|2-byte|1-byte|n-byte|1-byte|+---------------------------------------------------------------+
:020000040000FA:10000400FF00A0E314209FE5001092E5011092E5A3:00000001FF
對上面的HEX檔案進行分析:
第1條記錄的長度為02,LOADOFFSET為0000,RECTYPE為04,說明該記錄為擴充套件段地址記錄。資料為0000,校驗和為FA。從這個記錄的長度和資料,我們可以計算出一個基地址,這個地址為0X0000。後面的資料記錄都以這個地址為基地址。
第2條記錄的長度為10(16),LOADOFFSET為0004,RECTYPE為00,說明該記錄為資料記錄。資料為FF00A0E314209FE5001092E5011092E5,共16個BYTE。這個記錄的校驗和為A3。此時的基地址為0X0000,加上OFFSET,這個記錄裡的16BYTE的資料的起始地址就是0x0000+0x0004=0x0004.
第3條記錄的長度為00,LOADOFFSET為0000,TYPE=01,校驗和為FF。說明這個是一個ENDOFFILERECORD,標識檔案的結尾。
在上面這個例子裡,實際的資料只有16個BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址為0x4
HEX檔案和BIN檔案大小有區別
HEX檔案是用ASCII來表示二進位制的數值。例如一般8-BIT的二進位制數值0x3F,用ASCII來表示就需要分別表示字元"3"和字元"F",每個字元需要一個BYTE,所以HEX檔案需要>2倍的空間。對一個BIN檔案而言,你檢視檔案的大小就可以知道檔案包括的資料的實際大小。而對HEX檔案而言,你看到的檔案大小並不是實際的資料的大小。一是因為HEX檔案是用ASCII來表示資料,二是因為HEX檔案本身還包括別的附加資訊。
二進位制檔案 英文:Binaryfiles-包含在ASCII及擴充套件ASCII字元中編寫的資料或程式指令的檔案。計算機檔案基本上分為二種:二進位制檔案和ASCII(也稱純文字)檔案,圖形檔案及文字處理程式等計算機程式都屬於二進位制檔案。這些檔案含有特殊的格式及計算機程式碼。ASCII則是可以用任何文字處理程式閱讀的簡單文字檔案。 廣義的二進位制檔案即指檔案,由檔案在外部裝置的存放形式為二進位制而得名。狹義的二進位制檔案即除文字檔案以外的檔案。文字檔案是一種由很多行字元構成的計算機檔案。文字檔案存在於計算機系統中,通常在文字檔案最後一行放置檔案結束標誌。文字檔案的編碼基於字元定長,譯碼相對要容易一些;二進位制檔案編碼是變長的,靈活利用率要高,而譯碼要難一些,不同的二進位制檔案譯碼方式是不同的。 從本質上來說他們之間沒有什麼區別,因為他們在硬碟上都有一種的存放方式--二進位制,但是如果要對他們有些區分的話,那可以這樣理解。我們現在的每個字元由一個或多個位元組組成,每個位元組都是用的-128—127之間的部分數值來表示的,也就是說,-128——127之間還有一些資料沒有對應任何字元的任何位元組。如果一個檔案中的每個位元組的內容都是可以表示成字元的資料,我們就可以稱這個檔案為文字檔案,可見,文字檔案只是二進位制檔案中的一種特例,為了與文字檔案相區別,人們又把除了文字檔案以外的檔案稱為二進位制檔案,由於很難嚴格區分文字檔案和二進位制檔案的概念,所以我們可以簡單地認為,如果一個檔案專門用於儲存文字字元的資料,沒有包含字元以外的其他資料,我們就稱之為文字檔案,除此之外的檔案就是二進位制檔案。
IntelHEX檔案是由一行行符合IntelHEX檔案格式的文字所構成的ASCII文字檔案。在IntelHEX檔案中,每一行包含一個HEX記錄。這些記錄由對應機器語言碼和/或常量資料的十六進位制編碼數字組成。IntelHEX檔案通常用於傳輸將被存於ROM或者EPROM中的程式和資料。大多數EPROM程式設計器或模擬器使用IntelHEX檔案。
記錄格式
域IntelHEX由任意數量的十六進位制記錄組成。每個記錄包含5個域,它們按以下格式排列:
:llaaaatt[dd...]cc
每一組字母對應一個不同的域,每一個字母對應一個十六進位制編碼的數字。每一個域由至少兩個十六進位制編碼數字組成,它們構成一個位元組,就像以下描述的那樣:
:每個IntelHEX記錄都由冒號開頭.
ll是資料長度域它代表記錄當中資料位元組(dd)的數量。
aaaa是地址域它代表記錄當中資料的起始地址。
tt是代表HEX記錄型別的域它可能是以下資料當中的一個:
00–資料記錄
01–檔案結束記錄
02–擴充套件段地址記錄
04–擴充套件線性地址記錄
dd是資料域它代表一個位元組的資料。一個記錄可以有許多資料位元組.記錄當中資料位元組的數量必須和資料長度域(ll)中指定的數字相符。
cc是校驗和域它表示這個記錄的校驗和。校驗和的計算是透過將記錄當中所有十六進位制編碼數字對的值相加,以256為模進行以下補足。
編輯本段資料記錄IntelHEX檔案由任意數量以回車換行符結束的資料記錄組成。資料記錄外觀如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10是這個記錄當中資料位元組的數量。
2462是資料將被下載到儲存器當中的地址。
00是記錄型別(資料記錄)
464C…464C是資料。
33是這個記錄的校驗和。
編輯本段擴充套件線性地址記錄(HEX386)擴充套件線性地址記錄也叫作32位地址記錄或HEX386記錄。這些記錄包含資料地址的高16位。擴充套件線性地址記錄總是有兩個資料位元組,外觀如下:
:02000004FFFFFC
其中:
02是這個記錄當中資料位元組的數量。
0000是地址域,對於擴充套件線性地址記錄,這個域總是0000。
04是記錄型別04(擴充套件線性地址記錄)
FFFF是地址的高16位。
FC是這個記錄的校驗和,計算方法如下:
01h+NOT(02h+00h+00h+04h+FFh+FFh).
當一個擴充套件線性地址記錄被讀取,儲存於資料域的擴充套件線性地址被儲存,它被應用於從IntelHEX檔案讀取來的隨後的記錄。線性地址保持有效,直到它被另外一個擴充套件地址記錄所改變。
透過把記錄當中的地址域與被移位的來自擴充套件線性地址記錄的地址資料相加獲得資料記錄的絕對儲存器地址。
編輯本段以下的例子演示了這個過程1來自資料記錄地址域的地址2462
擴充套件線性地址記錄的資料域+FFFF
------------
絕對儲存器地址FFFF2462
擴充套件段地址記錄(HEX86)
擴充套件段地址記錄也叫HEX86記錄,它包括4-19位資料地址段。擴充套件段地址記錄總是有兩個資料位元組,外觀如下:
:020000021200EA
其中:
02是記錄當中資料位元組的數量。
0000是地址域.對於擴充套件段地址記錄,這個域總是0000。
02是記錄型別02(擴充套件段地址記錄)
1200是地址段。
EA是這個記錄的校驗和,計算方法如下:
01h+NOT(02h+00h+00h+02h+12h+00h).
當一個擴充套件段地址記錄被讀取,儲存於資料域的擴充套件段地址被儲存,它被應用於從IntelHEX檔案讀取來的隨後的記錄。段地址保持有效,直到它被另外一個擴充套件地址記錄所改變。
透過把記錄當中的地址域與被移位的來自擴充套件段地址記錄的地址資料相加獲得資料記錄的絕對儲存器地址。
以下的例子演示了這個過程
2來自資料記錄地址域的地址2462
擴充套件段地址記錄資料域+1200
---------
絕對儲存器地址00014462
檔案結束(EOF)記錄
IntelHEX檔案必須以檔案結束(EOF)記錄結束.這個記錄的記錄型別域的值必須是01.EOF記錄外觀總是如下:
:00000001FF
其中:
00是記錄當中資料位元組的數量.
0000是資料被下載到儲存器當中的地址.在檔案結束記錄當中地址是沒有意義被忽略的.0000h是典型的地址.
01是記錄型別01(檔案結束記錄)
FF是這個記錄的校驗和,計算方法如下:
01h+NOT(00h+00h+00h+01h).
3IntelHEX檔案例子:
下面是一個完整的IntelHEX檔案的例子:
:10001C00AD071FED600BE4FEEEC3947850F20E803A
:01002C00F7DC
:01002D0022B0
:100003007CFE8C807FFA12001C7801AF04EF08801D
:090013000123D8FDFCF58080EB0F
:0300000002002ECD
:0C002E00787FE4F6D8FD7581070200031E
:00000001FF
(PS:這是51微控制器“LED流水燈程式”的hex檔案)
編輯本段HEX檔案和BIN檔案格式區別HEX檔案和BIN檔案是我們經常碰到的兩種檔案格式。下面簡單介紹一下這兩種檔案格式的區別:
1-HEX檔案是包括地址資訊的,而BIN檔案格式只包括了資料本身
在燒寫或下載HEX檔案的時候,一般都不需要使用者指定地址,因為HEX檔案內部的資訊已經包括了地址。而燒寫BIN檔案的時候,使用者是一定需要指定地址資訊的。
2-BIN檔案格式對二進位制檔案而言,其實沒有”格式”。
檔案只是包括了純粹的二進位制資料。
3-HEX檔案格式HEX檔案都是由記錄(RECORD)組成的。
在HEX檔案裡面,每一行代表一個記錄。
記錄的基本格式為:+---------------------------------------------------------------+|RECORD|RECLEN|LOAD|RECTYPE|INFOorDATA|CHKSUM||MARK":"||OFFSET||||+---------------------------------------------------------------+|1-byte|1-byte|2-byte|1-byte|n-byte|1-byte|+---------------------------------------------------------------+
記錄型別包括:"00"DataRrecord:用來記錄資料,HEX檔案的大部分記錄都是資料記錄"01"EndofFileRecord:用來標識檔案結束,放在檔案的最後,標識HEX檔案的結尾"04"ExtendedLinearAddressRecord:用來標識擴充套件線性地址的記錄"02"ExtendedSegmentAddressRecord:用來標識擴充套件段地址的記錄在上面的後2種記錄,都是用來提供地址資訊的。每次碰到這2個記錄的時候,都可以根據記錄計算出一個“基”地址。對於後面的資料記錄,計算地址的時候,都是以這些“基”地址為基礎的。
資料記錄的具體格式:+---------------------------------------------------------------+|RECORD|RECLEN|LOAD|RECTYPE|INFOorDATA|CHKSUM||MARK":"||OFFSET|"00"|||+---------------------------------------------------------------+|1-byte|1-byte|2-byte|1-byte|n-byte|1-byte|+---------------------------------------------------------------+
看個例子::020000040000FA:10000400FF00A0E314209FE5001092E5011092E5A3:00000001FF
對上面的HEX檔案進行分析:
第1條記錄的長度為02,LOADOFFSET為0000,RECTYPE為04,說明該記錄為擴充套件段地址記錄。資料為0000,校驗和為FA。從這個記錄的長度和資料,我們可以計算出一個基地址,這個地址為0X0000。後面的資料記錄都以這個地址為基地址。
第2條記錄的長度為10(16),LOADOFFSET為0004,RECTYPE為00,說明該記錄為資料記錄。資料為FF00A0E314209FE5001092E5011092E5,共16個BYTE。這個記錄的校驗和為A3。此時的基地址為0X0000,加上OFFSET,這個記錄裡的16BYTE的資料的起始地址就是0x0000+0x0004=0x0004.
第3條記錄的長度為00,LOADOFFSET為0000,TYPE=01,校驗和為FF。說明這個是一個ENDOFFILERECORD,標識檔案的結尾。
在上面這個例子裡,實際的資料只有16個BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址為0x4
4-HEX檔案和BIN檔案大小有區別
HEX檔案是用ASCII來表示二進位制的數值。例如一般8-BIT的二進位制數值0x3F,用ASCII來表示就需要分別表示字元"3"和字元"F",每個字元需要一個BYTE,所以HEX檔案需要>2倍的空間。對一個BIN檔案而言,你檢視檔案的大小就可以知道檔案包括的資料的實際大小。而對HEX檔案而言,你看到的檔案大小並不是實際的資料的大小。一是因為HEX檔案是用ASCII來表示資料,二是因為HEX檔案本身還包括別的附加資訊。