美萍企業(yè)管理軟件海外aso優(yōu)化
hex文件里面只有00,01,04三種碼。那么我們?cè)诮馕龅臅r(shí)候只需要對(duì)這三種不同狀態(tài)的進(jìn)行不同的解析即可。
hex文件格式的解析,可閱讀:HEX文件格式詳解
首先創(chuàng)建一個(gè)Block的結(jié)構(gòu)體,根據(jù)經(jīng)驗(yàn)我們知道,一個(gè)數(shù)據(jù)塊有:開(kāi)始的地址,數(shù)據(jù)的長(zhǎng)度,以及數(shù)據(jù)Buffer。三個(gè)結(jié)果。而一個(gè)hex文件里面可能有多個(gè)數(shù)據(jù)塊,因此我們接下來(lái)聲明了5個(gè)數(shù)據(jù)塊。這個(gè)需要根據(jù)變量進(jìn)行調(diào)整。然后根據(jù)hex文件初始化數(shù)據(jù)塊的個(gè)數(shù)。再聲明變量 HexBlockTotalNumber 為數(shù)據(jù)塊的總數(shù)。
/*@!Encoding:936*/
variables
{struct Block {dword BlockStartAddr; //數(shù)據(jù)開(kāi)始的地址dword BlockDataLength; //數(shù)據(jù)的長(zhǎng)度byte dataBuffer[0x020FFFF]; //數(shù)據(jù)區(qū)域(單塊數(shù)據(jù)的Buffer,如果hex文件很大,則需要把參數(shù)調(diào)大)}; struct Block hexfile[5]; //創(chuàng)建5個(gè)數(shù)據(jù)塊(主要根據(jù)HEX文件進(jìn)行調(diào)整,hex有幾個(gè)數(shù)據(jù)塊就需要設(shè)置幾個(gè))int HexBlockTotalNumber = 0; //數(shù)據(jù)塊總數(shù)dword t1; //計(jì)算解析所用的時(shí)間
}/**********************************************************************************Function: //char2byte* Description: //把單個(gè)字符轉(zhuǎn)換為Byte的函數(shù)*Input: //ch:ASCII編碼字符,取值為0到F*Return: //val,為byte類型
**********************************************************************************/
byte char2byte(char ch)
{byte val;val = 0;if ( ch >= '0' && ch <= '9'){val = ch - '0'; }if ( ch >= 'a' && ch <= 'f'){val = (ch - 'a') + 10; }if ( ch >= 'A' && ch <= 'F'){val = (ch - 'A') + 10; }return val;
}/**********************************************************************************Function: //Read_hexFile* Description: //解碼HEX文件,只支持0x00,0x04,0x01類型*Input: //Filename:需要解碼的文件名*Output: //hexfile*Return: //void
**********************************************************************************/
//讀取HEXFILE
void Read_hexFile(char Filename[])
{long file_handle;char RowData[128]; //逐行讀取,每行數(shù)據(jù)緩存,當(dāng)每行數(shù)據(jù)大于128時(shí),需要將其調(diào)整dword i;dword RowDataByte; //單塊數(shù)據(jù)塊字節(jié)數(shù)qword OffsetAddress; //擴(kuò)展線性地址 qword ReAddr; //上一數(shù)據(jù)行起始地址 dword Len; //HEX每行有效數(shù)據(jù)字節(jié)數(shù)dword ReLen; //HEX前一次數(shù)據(jù)長(zhǎng)度dword Addr; //HEX每行起始地址dword Type; //HEX每行類型,有00,01,04四種類型RowDataByte = 0;i = 0;Len = 0;ReLen = 0;Addr=0;Type = 0;ReAddr = 0;file_handle = OpenFileRead(Filename,0);HexBlockTotalNumber = 0;if(file_handle!=0){ // Read all lineswhile ( fileGetStringSZ(RowData,elcount(RowData),file_handle)!=0 ){//判斷首字符是否為:號(hào)if(RowData[0] == ':'){Len = (char2byte(RowData[1])*0x10+char2byte(RowData[2]));Addr = char2byte(RowData[3])*0x1000+char2byte(RowData[4])*0x100+char2byte(RowData[5])*0x10+char2byte(RowData[6]);Addr |= (OffsetAddress << 16);Type = char2byte(RowData[7])*0x10+char2byte(RowData[8]);//以下為打印解析的過(guò)程,打印解析時(shí)候的變量//write("RowData:%s,HexBlockTotalNumber:%d,ReLen:%X,ReAddr:%X,Addr:%X,RowDataByte:%X",RowData,HexBlockTotalNumber,ReLen,ReAddr,Addr,RowDataByte);switch(Type){case 0x00: //數(shù)據(jù)if (Addr > (ReLen + ReAddr)){ //判斷為新數(shù)據(jù)塊if(RowDataByte == 0) //是否為首行數(shù)據(jù)字節(jié)數(shù){ hexfile[HexBlockTotalNumber].BlockStartAddr = Addr; //記錄新數(shù)據(jù)塊的起始地址}else //不是首行{hexfile[HexBlockTotalNumber].BlockDataLength = RowDataByte; //數(shù)據(jù)長(zhǎng)度 RowDataByte = 0; //重新開(kāi)始計(jì)數(shù)HexBlockTotalNumber++; hexfile[HexBlockTotalNumber].BlockStartAddr = Addr; //記錄新數(shù)據(jù)塊的起始地址}}for(i = 0; i< Len ; i++){//儲(chǔ)存buffer,注意沒(méi)有對(duì)crc進(jìn)行校驗(yàn)。hexfile[HexBlockTotalNumber].dataBuffer[RowDataByte++]=(char2byte(RowData[2*i+9])*0x10+char2byte(RowData[2*i+10]));} ReAddr = Addr; //保存當(dāng)前地址,下一次使用 ReLen = Len; //保存當(dāng)前長(zhǎng)度,下一次使用 break;case 0x04: //擴(kuò)展線性地址記錄OffsetAddress = char2byte(RowData[9])*0x1000+char2byte(RowData[10])*0x100+char2byte(RowData[11])*0x10+char2byte(RowData[12]); //偏移地址 break;case 0x01: //地址,結(jié)束 hexfile[HexBlockTotalNumber].BlockDataLength = RowDataByte; //數(shù)據(jù)長(zhǎng)度HexBlockTotalNumber++;break; } }}write("Hex文件讀取成功, 數(shù)據(jù)分塊:%d",HexBlockTotalNumber);for(i = 0; i < HexBlockTotalNumber; i++){write("數(shù)據(jù)塊:%d, 起始地址:0x%X, 結(jié)束地址:0x%X, 數(shù)據(jù)長(zhǎng)度:%6d字節(jié)\r\n", i+1, hexfile[i].BlockStartAddr, hexfile[i].BlockStartAddr + hexfile[i].BlockDataLength - 1, hexfile[i].BlockDataLength);}fileClose(file_handle);}else{write("OpenFileRead,error occurs");}}
on key 'f'
{t1 = timeNow();Read_hexFile(".//test.hex");write("解析耗時(shí):%f",t1-timeNow());write("數(shù)據(jù)塊:1");write(0);write("數(shù)據(jù)塊:2");write(1);
}write (byte blockNum)
{int i;for (i=0; i<16; i++) write("dataBuffer[%d]:0x%2X",i,hexfile[blockNum].dataBuffer[i]);
}
text.hex用Hexview打開(kāi)的結(jié)果,我們讀取圈中部分的數(shù)據(jù):
運(yùn)行結(jié)果:
參考:
CANOE CAPL編程 HEX文件讀取
https://blog.csdn.net/zengqz123/article/details/106550213