⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hexparser.h

📁 上位机软件 for avricp 根据功能设定熔丝
💻 H
📖 第 1 页 / 共 2 页
字号:
		start = _start;
		end = _end;
	}
	// 设定所有数据为 value 值.
	void clearAll( long value = 0xff ) 
	{
		for( long i = 0; i < size; i++ )
			data[i] = (unsigned char) (value & 0xff);
	}
	//获得数据起始位置
	long getRangeStart() { return start; } 
	//获得数据结束位置
	long getRangeEnd() { return end; }   
	//获得数据长度
	long getRangeLength() { return end+1; }   

	//获得指定位置数据
	long getData( long address )
	{
		if( address < 0 || address >= size )
			AfxMessageBox( "地址超出有效范围!" );
		
		return data[ address ];
	}
	//设置指定位置数据
	void setData( long address, long value )
	{
		if( address < 0 || address >= size )
			AfxMessageBox( "地址超出有效范围!" );
		
		data[ address ] = (unsigned char) (value & 0xff);
	}
	//获得缓冲区长度
	long getSize() { return size; }
	//读BIN文件至缓冲区
	long readBINFile() 
	{
		if(_handleFile==INVALID_HANDLE_VALUE)
		{
			AfxMessageBox( "文件错误! " );
			return false;
		}
		DWORD nNumberOfBytesToRead;
		LPDWORD lpNumberOfBytesRead=&nNumberOfBytesToRead;
		long baseAddress; // Base address for extended addressing modes.
		
		/* 准备 */
		baseAddress = 0;
		start = 0;
		end = 0;

		DWORD filesize=GetFileSize(_handleFile,NULL);
		if (filesize == 0xFFFFFFFF)
		{
			AfxMessageBox( "获取文件长度错误! " );
			return 0;
		}
		if (filesize > size)
		{
			AfxMessageBox( "文件长度超过缓冲区! " );
			return 0;
		}

		nNumberOfBytesToRead=filesize;
		int r=ReadFile(_handleFile,data,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL); 
		if(r==NULL) {return 0;}
		else 		
		{
			if(filesize)end=filesize-1;
			
		}
		return filesize;
	}
	//读HEX文件至缓冲区
	bool readHEXFile() 
	{
		if(_handleFile==INVALID_HANDLE_VALUE)
		{
			AfxMessageBox( "文件错误! " );
			return false;
		}
		DWORD nNumberOfBytesToRead;
		LPDWORD lpNumberOfBytesRead=&nNumberOfBytesToRead;
		char isHEXFileend=0;
		CString hexLine; // 包含 HEX 文件的一行.
		HEXRecord rec;   // 临时记录.
		
		long baseAddress; // Base address for extended addressing modes.
		long dataPos;     // Data position in record.
		
		/* 准备 */
		baseAddress = 0;
		start = size;
		end = 0;
		
		/* 分析记录 */
		char str[2];
		int r;
		
		do
		{
			// 读一行.
			str[1]='\x0';
			hexLine="";
			do{
				nNumberOfBytesToRead=1;
				r=ReadFile(_handleFile,str,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL);
				if(r && nNumberOfBytesToRead==0) {isHEXFileend=1;break;}
				else if(str[0]=='\r') break;
				else if(str[0]=='\n') break;//continue;
				else if(isxdigit(str[0] ) || str[0] ==':')hexLine+=str;
				else 		
				{
					AfxMessageBox( "读文件发现无效字符! " );
					return false;
				}
				
			}while(true);
			/* 转换为记录 */
			if(hexLine.GetLength())
				if(parseRecord( hexLine, &rec ))
				{
					
					switch( rec.type )
					{
					case 0x00 : // 数据记录 ?
						/* 复制数据 */
						if( baseAddress + rec.offset + rec.length > size )
						{
							AfxMessageBox( "HEX 文件数据超出缓冲区! " );
							return false;
						}
						
						for( dataPos = 0; dataPos < rec.length; dataPos++ )
							data[ baseAddress + rec.offset + dataPos ] = rec.data[ dataPos ];
						
						/* 更新数据起始位置 */
						if( baseAddress + rec.offset < start )
							start = baseAddress + rec.offset;
						
						if( baseAddress + rec.offset + rec.length - 1 > end )
							end = baseAddress + rec.offset + rec.length - 1;
						
						break;
						
						
					case 0x02 : // 扩展段地址记录 ?
						baseAddress = (rec.data[0] << 8) | rec.data[1];
						baseAddress <<= 4;
						break;
						
					case 0x03 : // 起始段地址记录 ?
						break; // 忽略, since we have no influence on execution start address.
						
					case 0x04 : // 扩展行地址记录 ?
						baseAddress = (rec.data[0] << 8) | rec.data[1];
						baseAddress <<= 16;
						break;
						
					case 0x05 : // 起始行地址记录 ?
						break; // 忽略, since we have no influence on exectuion start address.
						
					case 0x01 : // 文件结束 ?
						//f.close();
						return true;
						
					default:
						AfxMessageBox( "不支持的 HEX 记录格式" );
						return false;
					}
				}
				
		}while( !isHEXFileend );
			
			
			/* 没有结束行 */
			//AfxMessageBox( "确定文件包含结束行!" );
		return true;
	}
	// 写数据至 HEX 文件.
	bool writeHEXFile() 
	{
		if(_handleFile==INVALID_HANDLE_VALUE)
		{
			AfxMessageBox( "文件错误! " );
			return false;
		}
		DWORD nNumberOfBytesToWrite;
		LPDWORD lpNumberOfBytesWritten=&nNumberOfBytesToWrite;
		
		HEXRecord rec; // 临时记录.
		
		long baseAddress; // 基础位置.
		long offset;      // 偏移量.
		long dataPos;     // 记录内位置.
		
		enum
		{ 
			_first,
				_writing,
				_passed64k
		} status; // 写状态, 见下面用法.
		
		/* 创建文件 */
		
		/* 预处理 */	
		status = _first;
		rec.data = new unsigned char[ 16 ]; // 仅使用16字节记录.
		
		baseAddress = start & ~0xffff; // 64K 对齐地址.
		offset = start & 0xffff; // 对齐地址的偏移量.
		dataPos = 0;
		
		/* Write first base address record to HEX file */
		rec.length = 2;
		rec.offset = 0;
		rec.type = 0x02;
		rec.data[1] = 0x00;
		rec.data[0] =(unsigned char)( baseAddress >> 12); // Give 4k page index.
		if(!writeRecord( &rec ))return false; // Write the HEX record to file.
		
		
		/* 写入使用范围内的所有字节 */
		do
		{
			/* Put data into record */
			rec.data[ dataPos ] = data[ baseAddress + offset + dataPos ];
			dataPos++;
			
			/* Check if we need to write out the current data record */
			if( offset + dataPos >= 0x10000 || // 到达 64k 边界?
				dataPos >= 16 || // 数据记录满?
				baseAddress + offset + dataPos > end ) // 到达使用范围尾部?
			{
				/* 写入当前数据记录 */
				rec.length = (unsigned char)dataPos;
				rec.offset = offset;
				rec.type = 0x00; // 数据记录.
				
				writeRecord(&rec );
				
				offset += dataPos;
				dataPos = 0;
			}    
			
			/* 检查是否超过 64k 边界 */
			if( offset + dataPos >= 0x10000 )
			{
				/* 更新地址指针 */
				offset -= 0x10000;
				baseAddress += 0x10000;
				
				/* 写入新基址的记录至 HEX 文件 */
				rec.length = 2;
				rec.offset = 0;
				rec.type = 0x02;
				rec.data[0] = (unsigned char)(baseAddress >> 12); // Give 4k page index.
				rec.data[1] = 0x00;
				
				if(!writeRecord( &rec ))return false; // Write the HEX record to file.
			}
		} while( baseAddress + offset + dataPos <= end );
		
		
		/* 写入 EOF 记录 */
		rec.length = 0;
		rec.offset = 0;
		rec.type = 0x01;
		
		return (writeRecord(&rec) );
	}
	// 写数据至 BIN 文件.
	long writeBINFile() 
	{
		if(_handleFile==INVALID_HANDLE_VALUE)
		{
			AfxMessageBox( "文件错误! " );
			return false;
		}
		DWORD nNumberOfBytesToWrite;
		LPDWORD lpNumberOfBytesWritten=&nNumberOfBytesToWrite;
		nNumberOfBytesToWrite=getRangeEnd()+1;
		if(WriteFile(_handleFile,data,nNumberOfBytesToWrite,lpNumberOfBytesWritten,NULL)==NULL)
			return 0;
		
		return nNumberOfBytesToWrite;
	}
bool simplifyData()
{
	long tmp_end=end;				// 缓冲区有用数据起始位置和结束位置
	//long tmp_size=size;						// 数据缓冲区长度.
	while(data[end]==0xff)
	{
		end--;
	}
	return (tmp_end != end );
}

	
};

#endif
/* end of file */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -