最近工作中需要把HEX中的数据提取出来保存为BIN文件,今天就把我的读取HEX文件的方法分享出来。
HEX文件格式是可以烧写到嵌入式芯片中的一种文件格式,一般是通过C或者汇编语言编译后生成,任何的文本编辑软件都可以查看此文件,我一般使用NOTEPAD++。
整个文件以行为单位,每行以冒号开头,内容全部为16进制
下面用一个例子来说明:
:20008000DAF8220261E19010DCEFF0E49005A6F09010E8F09010E3F0E5665407FFBF070464
第一个20为数据长度,表示后面的数据有32字节。
紧跟着后面的00 80为地址,表示这行数据在芯片中的保存位置。
再后面的00为数据类型,类型共分以下几类:
'00' 有效的数据
'01' 文件结束
'02' 扩展段地址记录
'03' 开始段地址记录
'04' 扩展线性地址记录
'05' 开始线性地址记录
接着00后面的32字节就是数据
DAF8220261E19010DCEFF0E49005A6F09010E8F09010E3F0E5665407FFBF0704
最后一个64是校验码。
在我多次使用中数据类型只用到了00,04,01,下面是代码示例(由于C#是自学的非常不专业)最大支持512KB的文件读取,并且起始地址是0:
byte[] frimwareArray = new byte[512*1024];
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;
}