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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Hex文件解读

發(fā)布時(shí)間:2023/12/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hex文件解读 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在實(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é)

以上是生活随笔為你收集整理的Hex文件解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。