c语言解析hex文件格式,HEX文件格式,ihex,hex解析
來自:http://blog.csdn.net/GZFStudy/archive/2008/09/03/2873814.aspx
Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 構 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一 個 HEX 記錄 。 這 些 記錄 由 對應 機器 語 言 碼 和/ 或常量 數 據的十六 進 制 編碼數 字 組 成。Intel HEX 文件通常用于 傳輸將 被存于ROM 或者EPROM 中的程序和 數 據。大多 數 EPROM 編 程器或模 擬器使用Intel HEX 文件。 記錄 格式Intel HEX 由任意數量的十六 進 制 記錄組 成。每 個記錄 包含5 個 域, 它們按以下格式排列::llaaaatt[dd...]cc 每一組字母 對應 一 個 不同的域,每一 個 字母 對應 一 個 十六 進 制 編碼 的 數 字。每一 個 域由至少 兩個 十六 進 制 編碼數 字 組 成, 它們構 成一 個 字 節 ,就像以下描述的那 樣:
: 每個Intel HEX 記錄 都由冒 號開頭 .
ll 是 數 據 長 度域, 它 代表 記錄當 中 數 據字 節 (dd) 的 數量 .
aaaa 是地址域, 它代表 記錄當 中 數據的起始地址 .
tt 是代表HEX 記錄類 型的域 , 它 可能是以下 數 據 當 中的一 個:
00 – 數 據 記錄
01 – 文件結 束 記錄
02 – 擴展段地址 記錄
04 – 擴展 線 性地址 記錄
dd 是數 據域 , 它 代表一 個 字 節 的 數 據. 一 個記錄 可以有 許 多 數 據字 節 . 記錄當 中 數 據字 節 的 數 量必 須 和 數 據 長 度域(ll) 中指定的 數字相符.
cc 是校驗 和域 , 它 表示 這個記錄 的校 驗 和. 校 驗 和的 計 算是通 過將記錄當 中所有十六 進 制 編碼數 字 對 的 值 相加, 以256 為 模 進 行以下 補 足.
表示為:“:[1字節長度][4字節地址][1字節記錄類型][數據段][校驗和] ”
數 據 記錄
Intel HEX文件由任意數 量以回 車換 行符 結 束的 數 據 記錄組 成. 數 據 記錄 外 觀如下:
:10246200464C5549442050524F46494C4500464C33 其中:
10 是這個記錄當中 數 據字 節 的 數量.即0x10
2462 是數據 將 被下 載 到存 儲 器 當中的地址.即0x2462
00 是記錄類型( 數 據 記錄).即0x00
464C…464C是 數據.分別代表0x46,0x4C...
33 是這個記錄的校 驗和.即0x33
擴展 線 性地址 記錄(HEX386)
擴 展 線 性地址 記錄 也叫作32 位地址 記錄 或HEX386 記錄 . 這 些 記錄 包含 數 據地址的高16 位. 擴 展 線 性地址 記錄總 是有 兩個數 據字 節 , 外 觀如下:
:02000004FFFFFC 其中:
02 是這個記錄當中 數 據字 節 的 數量.
0000 是地址域, 對于 擴 展 線 性地址 記錄 , 這個 域 總是0000.
04 是記錄類型04( 擴 展 線 性地址 記錄)
FFFF 是地址的高16 位.
FC 是這個記錄的校 驗 和, 計算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh). 當一 個擴 展 線 性地址 記錄 被 讀 取, 存 儲 于 數 據域的 擴 展 線 性地址被保存, 它 被 應 用于 從 Intel HEX 文件 讀 取 來 的 隨 后的 記錄 . 線 性地址保持有效, 直到 它 被另外一 個擴 展地址 記錄 所改 變.
通 過 把 記錄當 中的地址域 與 被移位的 來 自 擴 展 線 性地址 記錄 的地址 數 據相加 獲 得 數 據 記錄 的 絕對 存 儲器地址. 以下的例子演示了這個過 程.. 來自 數 據 記錄地址域的地址2462 擴展 線 性地址 記錄 的 數據域+ FFFF
------------ 絕對存 儲 器地址FFFF2462
擴 展段地址 記錄(HEX86)
擴 展段地址 記錄 也叫HEX86 記錄 , 它 包括4-19 位 數 據地址段. 擴 展段地址 記錄總 是有 兩個數 據字 節 , 外 觀如下:
:020000021200EA 其中:
02 是記錄當中 數 據字 節 的 數量.
0000 是地址域. 對于 擴 展段地址 記錄 , 這個 域 總是0000.
02 是記錄類型02( 擴 展段地址 記錄)
1200 是地址段.
EA 是這個記錄的校 驗 和, 計算方法如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h). 當一 個擴 展段地址 記錄 被 讀 取, 存 儲 于 數 據域的 擴 展段地址被保存, 它 被 應 用于 從 Intel HEX 文件 讀 取 來 的 隨 后的 記錄 . 段地址保持有效, 直到 它 被另外一 個擴 展地址 記錄 所改 變.
通 過 把 記錄當 中的地址域 與 被移位的 來 自 擴 展段地址 記錄 的地址 數 據相加 獲 得 數 據 記錄 的 絕對 存 儲器地址. 以下的例子演示了這個過 程.. 來自 數 據 記錄地址域的地址2462 擴展段地址 記錄數據域+??1200
--------- 絕對存 儲 器地址00014462
文件 結 束(EOF) 記錄
Intel HEX文件必須 以文件 結 束(EOF) 記錄結 束. 這個記錄 的 記錄類 型域的 值 必 須 是01.EOF 記錄 外 觀總是如下:
:00000001FF 其中:
00 是記錄當中 數 據字 節 的 數量.
0000 是數據被下 載 到存 儲 器 當 中的地址. 在文件 結 束 記錄當 中地址是 沒 有意 義被忽略的.0000h 是典型的地址.
01 是記錄類型01( 文件 結 束 記錄)
FF 是 這個記錄 的校 驗 和, 計算方法如下:
01h + NOT(00h + 00h + 00h + 01h).
Intel HEX 文件例子: 下面是一個 完整的Intel HEX 文件的例子:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244
:10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
:04003F00A42EFE22CB
:00000001FF
//追加一段
//-------------貼一段解析的c語言,這才是精華-------------------
int ParseIHexPerLine(const char *buf,const char *path,int line)
{
unsigned int nbytes=0,addr=0,type=0,i,val,line_chksum;
unsigned char data[1024];
unsigned char cksum;
const char *s=buf;
if(*s!=':') //第一個為冒號
{
fprintf(stderr,"%s:%s: format violation (1)/n",path,line);
return(1);
}
++s;
//接下來的8個字節為數據大小、地址等
if(sscanf(s,"%02x%04x%02x",&nbytes,&addr,&type)!=3)
{
fprintf(stderr,"%s:%s: format violation (2)/n",path,line);
return(1);
}
s+=8;
//讀到的類型
if(type==0) //為數據段
{
if(!(nbytes>=0 && nbytes<1024))
{
perror("nbyte per line unsupport/n");
return(-1);
}
cksum=nbytes+addr+(addr>>8)+type;
//
for(i=0; i
{
val=0;
if(sscanf(s,"%02x",&val)!=1)
{
fprintf(stderr,"%s:%s: format violation (3)/n",path,line);
return(1);
}
s+=2;
data[i]=val;
cksum+=val;
}
//
line_chksum=0;
if(sscanf(s,"%02x",&line_chksum)!=1)
{
fprintf(stderr,"%s:%s: format violation (4)/n",path,line);
return(1);
}
if((cksum+line_chksum)&0xff)
{
fprintf(stderr,"%s:%s: checksum mismatch (%u/%u)/n",
cksum,line_chksum);
return(1);
}
if(WriteRAM(addr,data,nbytes))
return(1);
}
else if(type==1)
{
// EOF marker. Oh well, trust it.
return(-1);
}
else
{
fprintf(stderr,"%s:%s: Unknown entry type %d/n",type);
return(1);
}
return(0);
}
總結
以上是生活随笔為你收集整理的c语言解析hex文件格式,HEX文件格式,ihex,hex解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UE4_地图程序化随机生成
- 下一篇: 职场各“族”都能成功