📄 hexparser.h
字号:
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 + -