实现修改HEX文件和S19文件的值

之前有分享过HEX文件和S19文件的详细解析,之后做了写了段代码实现修改他们的值,因为一般的HEX文件和S19文件都可以同txt文件一样实现读取,所以用C语言实现起来也比较方便。

  1 修改Hex文件的值

UCHAR UCHAR_to_DATA(UCHAR data0, UCHAR data1)
{
	if ( data0>='a' && data0<='f' ) data0 = data0 - 'a' + 10;
	if ( data0>='A' && data0<='F' ) data0 = data0 - 'A' + 10;
	if ( data0>='0' && data0<='9' ) data0 = data0 - '0';

	if ( data1>='a' && data1<='f' ) data1 = data1 - 'a' + 10;
	if ( data1>='A' && data1<='F' ) data1 = data1 - 'A' + 10;
	if ( data1>='0' && data1<='9' ) data1 = data1 - '0';

	return( data0*16 + data1 );
}
void DATA_to_UCHAR(UCHAR data, char &result0, char &result1)
{
	if (data/16<10) 
		result0=data/16+0x30;
	else            
		result0=data/16+0x37;
	if (data%16<10) 
		result1=data%16+0x30;
	else            
		result1=data%16+0x37;
}

/************************************************************************/
/* 函数功能:修改所设定地址对应的Hex值 */ 
/* n为修改的字节大小                                        */
/************************************************************************/
UCHAR SetValue(CString path,long VarRomaddress,UCHAR*pHex, int n)
{
	char buf[10] ;//用于存储Hex文件中每行的前10个字符
	UCHAR len;//记录长度
	long StartAddress, EndAddress,ExtendAddress = 0;
	UCHAR returndata = 0;//返回数据
	FILE *fp = fopen(path, "r+");//以读写方式打开文件
	if (!fp)
	{
		return 0;
	}
	int k = 0;
	while (!feof(fp) && k < n)
	{
		fgets(buf, 10, fp);							
		len = UCHAR_to_DATA(buf[1], buf[2]);
		int charlen = len*2+4;
		char *addr_data = new char [charlen];
		fgets(addr_data, charlen, fp);
		if (buf[8] == '0')//对应数据记录
		{			
			StartAddress =ExtendAddress*65536+(UCHAR_to_DATA(buf[3], buf[4])<<8) +UCHAR_to_DATA(buf[5], buf[6]);//此处为开始地址
			EndAddress = StartAddress +len-1;
			if ((VarRomaddress>=StartAddress) &&(VarRomaddressaddr_data[0], addr_data[1])<<8) +UCHAR_to_DATA(addr_data[2], addr_data[3]);
		}
		else if (buf[1] == '1')//对应文件结束记录
		{
			fclose(fp);
			return 0;
		}
		delete []addr_data;
	}
	fclose(fp);
	return 1;
}

2修改S19文件的值

/* 函数功能:修改所设定地址对应的Hex值 */ 
/* n为修改的字节大小                                        */
/************************************************************************/
UCHAR SetValue(CString path, long VarRomaddress, UCHAR*pHex, int n)
{
	char buf[5] ;//用于存储S19文件中每行的前4个字符,即记录类型+记录长度
	UCHAR len;//记录长度
	long StartAddress, EndAddress = 0;
	UCHAR returndata = 0;//返回数据
	FILE *fp = fopen(path, "r+");//以读写方式打开文件
	if (!fp)
	{
		return 0;
	}
	int k = 0;
	while (!feof(fp) && k < n)
	{
		fgets(buf, 5, fp);							
		len = UCHAR_to_DATA(buf[2], buf[3]);
		int charlen = len*2+2;
		char *addr_data = new char [charlen];
		fgets(addr_data, charlen, fp);
		if (buf[1] == '1')//对应S1记录
		{			
			StartAddress = (UCHAR_to_DATA(addr_data[0], addr_data[1])<<8) +UCHAR_to_DATA(addr_data[2], addr_data[3]);//此处为ROM地址
			EndAddress = StartAddress +len -4;
			if ((VarRomaddress>=StartAddress) &&(VarRomaddress=StartAddress) &&(VarRomaddress

你可能感兴趣的:(C++,嵌入式)