首页 » 智能 » 用C代码读取HEX文件中的数据_年夜众_地址

用C代码读取HEX文件中的数据_年夜众_地址

萌界大人物 2024-11-23 00:50:10 0

扫一扫用手机浏览

文章目录 [+]

HEX文件格式是可以烧写到嵌入式芯片中的一种文件格式,一样平常是通过C或者汇编措辞编译后天生,任何的文本编辑软件都可以查看此文件,我一样平常利用NOTEPAD++。

全体文件以行为单位,每行以冒号开头,内容全部为16进制

用C代码读取HEX文件中的数据_年夜众_地址 用C代码读取HEX文件中的数据_年夜众_地址 智能

HEX文件示例

用C代码读取HEX文件中的数据_年夜众_地址 用C代码读取HEX文件中的数据_年夜众_地址 智能
(图片来自网络侵删)

下面用一个例子来解释:

:20008000DAF8220261E19010DCEFF0E49005A6F09010E8F09010E3F0E5665407FFBF070464

第一个20为数据长度,表示后面的数据有32字节。

紧随着后面的00 80为地址,表示这行数据在芯片中的保存位置。

再后面的00为数据类型,类型共分以下几类:

'00' 有效的数据

'01' 文件结束

'02' 扩展段地址记录

'03' 开始段地址记录

'04' 扩展线性地址记录

'05' 开始线性地址记录

接着00后面的32字节便是数据DAF8220261E19010DCEFF0E49005A6F09010E8F09010E3F0E5665407FFBF0704

末了一个64是校验码。

在我多次利用中数据类型只用到了00,04,01,下面是代码示例(由于C#是自学的非常不专业)最大支持512KB的文件读取,并且起始地址是0:

C#读取HEX文件示例

byte[] frimwareArray = new byte[5121024];

for (int i = 0; i < frimwareArray.Length; i++)

{

frimwareArray[i] = 0xFF;

}

StreamReader strFile = new StreamReader(hexfile);

Int32 hexCounter = 0;

Int32 lineOffset = 0;

string hexLine = string.Empty;

Int32 hexLineAddress = 0;

Int32 hexLineLen = 0;

hexMaxAddress = 0;

while (strFile.EndOfStream != true)

{

hexLine = strFile.ReadLine();

if (hexLine.Substring(0, 1) == \"大众:\"大众)

{

if (hexLine.Substring(7, 2) == \"大众00\"大众)//有效的数据

{

hexLineAddress = HEX2INT32(hexLine.Substring(3, 4)); //截取相对数据地址

hexCounter = hexLineAddress + lineOffset; //相对数据地址+线性偏移地址==绝对的数据地址

hexLineLen = HEX2INT32(hexLine.Substring(1, 2)); //获数据的数据长度

for (int i = 0; i < hexLineLen; i++) //读取hex文件中的数据

{

frimwareArray[hexCounter++] = (byte)HEX2INT(hexLine.Substring((i 2) + 9, 2));

}

if (hexMaxAddress < hexCounter) //更新最大的hex文件地址

{

hexMaxAddress = hexCounter;

}

}

else if (hexLine.Substring(7, 2) == \公众04\"大众)//扩展线性地址记录

{

lineOffset = HEX2INT32(hexLine.Substring(9, 4)) 65536;

}

else if (hexLine.Substring(7, 2) == \公众01\"大众)//文件结束

{

strFile.Close();

break;

}

}

else

{

strFile.Close();

MessageBox.Show(\"大众Hex file error\"大众, \"大众Waring\"大众,MessageBoxButtons.OK,MessageBoxIcon.Error);

break;

}

标签:

相关文章