日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

用C#代碼讀取HEX文件中的數(shù)據(jù)方法 hex文件用什么軟件打開

最近工作中需要把HEX中的數(shù)據(jù)提取出來保存為BIN文件,今天就把我的讀取HEX文件的方法分享出來 。
HEX文件格式是可以燒寫到嵌入式芯片中的一種文件格式,一般是通過C或者匯編語言編譯后生成,任何的文本編輯軟件都可以查看此文件,我一般使用NOTEPAD++ 。
整個(gè)文件以行為單位,每行以冒號開頭,內(nèi)容全部為16進(jìn)制

用C#代碼讀取HEX文件中的數(shù)據(jù)方法 hex文件用什么軟件打開


HEX文件示例
下面用一個(gè)例子來說明:
:20008000DAF8220261E19010DCEFF0E49005A6F09010E8F09010E3F0E5665407FFBF070464
第一個(gè)20為數(shù)據(jù)長度,表示后面的數(shù)據(jù)有32字節(jié) 。
緊跟著后面的00 80為地址,表示這行數(shù)據(jù)在芯片中的保存位置 。
再后面的00為數(shù)據(jù)類型,類型共分以下幾類:
'00' 有效的數(shù)據(jù)
'01' 文件結(jié)束
'02' 擴(kuò)展段地址記錄
'03' 開始段地址記錄
'04' 擴(kuò)展線性地址記錄
'05' 開始線性地址記錄
接著00后面的32字節(jié)就是數(shù)據(jù)
DAF8220261E19010DCEFF0E49005A6F09010E8F09010E3F0E5665407FFBF0704
最后一個(gè)64是校驗(yàn)碼 。
在我多次使用中數(shù)據(jù)類型只用到了00,04,01,下面是代碼示例(由于C#是自學(xué)的非常不專業(yè))最大支持512KB的文件讀取,并且起始地址是0:
【用C#代碼讀取HEX文件中的數(shù)據(jù)方法 hex文件用什么軟件打開】
用C#代碼讀取HEX文件中的數(shù)據(jù)方法 hex文件用什么軟件打開


C#讀取HEX文件示例
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")//有效的數(shù)據(jù)
{
hexLineAddress = HEX2INT32(hexLine.Substring(3, 4)); //截取相對數(shù)據(jù)地址
hexCounter = hexLineAddress + lineOffset; //相對數(shù)據(jù)地址+線性偏移地址==絕對的數(shù)據(jù)地址
hexLineLen = HEX2INT32(hexLine.Substring(1, 2)); //獲數(shù)據(jù)的數(shù)據(jù)長度
for (int i = 0; i < hexLineLen; i++) //讀取hex文件中的數(shù)據(jù)
{
frimwareArray[hexCounter++] = (byte)HEX2INT(hexLine.Substring((i * 2) + 9, 2));
}
if (hexMaxAddress < hexCounter) //更新最大的hex文件地址
{
hexMaxAddress = hexCounter;
}
}
else if (hexLine.Substring(7, 2) == "04")//擴(kuò)展線性地址記錄
{
lineOffset = HEX2INT32(hexLine.Substring(9, 4)) * 65536;
}
else if (hexLine.Substring(7, 2) == "01")//文件結(jié)束
{
strFile.Close();
break;
}
}
else
{
strFile.Close();
MessageBox.Show("Hex file error", "Waring",MessageBoxButtons.OK,MessageBoxIcon.Error);
break;
}

    推薦閱讀