Hex文件解读
在實(shí)際工作中會(huì)遇到.bin/.par/.hex類(lèi)型的文件。并不是說(shuō)如何使用,只是對(duì)于文件本身進(jìn)行解讀而已。
前面兩種總體來(lái)說(shuō)就是簡(jiǎn)單的二進(jìn)制文件,其中.bin文件是大家在使用,通用的二進(jìn)制文件,而.par文件是華為使用的,不知道為什么他們要用.par為文件類(lèi)型,并且也好像就他們?cè)谑褂枚?#xff0c;跟.bin文件差別。
今天主要講將對(duì)于.hex文件的理解,其實(shí)網(wǎng)上到處都是說(shuō)的,有的說(shuō)的簡(jiǎn)單,有的說(shuō)的復(fù)雜。整理一下資料與思路。
定義:Intel HEX 文件是遵循 Intel HEX 文件格式的 ASCII 文本文件。在 Intel HEX 文件的每一行都包含了一個(gè) HEX 記錄。這些記錄是由一些代表機(jī)器語(yǔ)言代碼和常量的16進(jìn)制數(shù)據(jù)組成的。Intel HEX 文件常用來(lái)傳輸要存儲(chǔ)在 ROM 或者 EPROM 中的程序和數(shù)據(jù)。大部分的 EPROM 編程器能使用 Intel HEX 文件。Intel HEX由任意數(shù)量的十六進(jìn)制記錄組成。
每個(gè)hex文件使用二進(jìn)制打開(kāi)后,是需要轉(zhuǎn)義成ascii字符的,每行以冒號(hào)為開(kāi)始符,回車(chē)與換行為結(jié)束符。
比如:
:1000000018F09FE518F09FE518F09FE518F09FE5C0\r\n
拆分成:
:+10+0000+00+18F09FE518F09FE518F09FE518F09FE5+C0+\r\n
Start Code+Byte count?+Address?+Record type?+Data?+Checksum+endline
Start?
Code
?
?
每個(gè)
?
Intel?
HEX?
記錄都由冒號(hào)開(kāi)頭
?
Byte?
count
?
是數(shù)據(jù)長(zhǎng)度域,它代表記錄當(dāng)中數(shù)據(jù)字節(jié)的數(shù)量
?
Address
?
是地址域,它代表記錄當(dāng)中數(shù)據(jù)的起始地址
?
Record?
type
?
是代表
HEX
記錄類(lèi)型的域,它可能是以下數(shù)據(jù)當(dāng)中的一個(gè):
?
?
?
00-
數(shù)據(jù)記錄
?
?
?
01-
文件結(jié)束記錄
?
?
?
02-
擴(kuò)展段地址記錄
?
?
?
03-
開(kāi)始段地址記錄
?
?
?
04-
擴(kuò)展線性地址記錄
?
?
?
05-
開(kāi)始線性地址記錄
?
Data
?
是數(shù)據(jù)域,一個(gè)記錄可以有許多數(shù)據(jù)字節(jié)
.
記錄當(dāng)中數(shù)據(jù)字節(jié)的數(shù)量必須和數(shù)據(jù)長(zhǎng)度域中
指定的數(shù)字相符
?
Checksum
?
是校驗(yàn)和域,它表示這個(gè)記錄的校驗(yàn)和
.
校驗(yàn)和的計(jì)算是通過(guò)將記錄當(dāng)中所有十六
進(jìn)制編碼數(shù)字對(duì)的值相加,以
256
為模進(jìn)行以下補(bǔ)足。
其中:
Byte count 是數(shù)據(jù)長(zhǎng)度域,它代表記錄當(dāng)中數(shù)據(jù)字節(jié)的數(shù)量 Address 是地址域,它代表記錄當(dāng)中數(shù)據(jù)的起始地址?
Record type 是代表HEX記錄類(lèi)型的域,它可能是以下數(shù)據(jù)當(dāng)中的一個(gè): ? 00-數(shù)據(jù)記錄 ? 01-文件結(jié)束記錄 ? 02-擴(kuò)展段地址記錄 ? 03-開(kāi)始段地址記錄 ? 04-擴(kuò)展線性地址記錄 ? 05-開(kāi)始線性地址記錄?
Data 是數(shù)據(jù)域,一個(gè)記錄可以有許多數(shù)據(jù)字節(jié).記錄當(dāng)中數(shù)據(jù)字節(jié)的數(shù)量必須和數(shù)據(jù)長(zhǎng)度域中指定的數(shù)字相符?
Checksum 是校驗(yàn)和域,它表示這個(gè)記錄的校驗(yàn)和.校驗(yàn)和的計(jì)算是通過(guò)將記錄當(dāng)中所有十六進(jìn)制編碼數(shù)字對(duì)的值相加,以256為模進(jìn)行以下補(bǔ)足。
介紹完了這些基本信息,代碼的實(shí)現(xiàn)也簡(jiǎn)單了。以c#為例:
1、讀取hex文件,按二進(jìn)制的方式。hexPath為文件的絕對(duì)路徑。
?byte[] hexBytes = File.ReadAllBytes(hexPath);
2、將二進(jìn)制轉(zhuǎn)成文本
string hexStr = ASCIIEncoding.ASCII.GetString(hexBytes);
3、將文本進(jìn)行拆分,并去掉開(kāi)始符、結(jié)束符,創(chuàng)建一個(gè)List來(lái)放數(shù)據(jù)
char[] Delimiters = new char[3] { '\r', '\n', ':' };
string[] lines = hexStr.Split(Delimiters, StringSplitOptions.RemoveEmptyEntries);//分隔后去掉空行
List<byte> hexList = new List<byte>();
4、循環(huán)讀取每行的信息
?foreach (string line in lines)
{
...
}
5、針對(duì)每行進(jìn)行處理
a、首先看每行的長(zhǎng)度
? int lenline = line.Length;
? ? ? ? ? ? ? ? if ((lenline % 2) != 0)//如果取出來(lái)長(zhǎng)度不是2的倍數(shù),說(shuō)明有問(wèn)題
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? MessageBox.Show("此行長(zhǎng)度有問(wèn)題");
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? lenline = lenline / 2;
b、將整行的文本按每?jī)蓚€(gè)字符一組拆分,每組為一個(gè)16進(jìn)制的數(shù),并計(jì)算校驗(yàn)和
byte[] tem = new byte[lenline];
? ? ? ? ? ? ? ? int checksum = 0;
? ? ? ? ? ? ? ? for (int i = 0; i < lenline; i++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? tem[i] = Convert.ToByte(line.Substring(2 * i, 2), 16);
? ? ? ? ? ? ? ? ? ? if (i < lenline - 1) { checksum = checksum + tem[i]; }//計(jì)算校驗(yàn)和 ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? checksum = (checksum ^ 255) + 1;
? ? ? ? ? ? ? ? checksum = checksum & 255;
? ? ? ? ? ? ? ? if (checksum != tem[lenline - 1])
? ? ? ? ? ? ? ? {?
? ? ? ? ? ? ? ? ? ? MessageBox.Show("校驗(yàn)和檢查失敗");
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
c、檢查Record type,數(shù)據(jù)才是我們需要的,其他的都不需要
if (tem[3] == 1 || tem[3] == 4 || tem[3] == 5) {continue; }
d、檢查地址是不正確
int address = tem[1] * 256 + tem[2];
? ? ? ? ? ? ? ? if (address != hexList.Count) {
? ? ? ? ? ? ? ? ? ? MessageBox.Show("地址異常");
? ? ? ? ? ? ? ? ? ? return; ? ? ??
? ? ? ? ? ? ? ? }
f、將實(shí)際數(shù)據(jù)取出來(lái)放在List中去
? for (int i = 4; i < lenline - 1; i++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? hexList.Add(tem[i]);
? ? ? ? ? ? ? ? }
這樣就完成了。
我之前一直以為hex文件跟bin文件一樣,都是按二進(jìn)制來(lái)查看的,是我想太簡(jiǎn)單了。
總結(jié)
- 上一篇: Excel 使用小妙招之解决“##”显示
- 下一篇: String Hex互相转换