日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言解析hex文件格式,HEX文件格式,ihex,hex解析

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。