/// <summary> /// 将指定的数据保存为Hex数据行数 /// </summary> /// <param name="hexVal">数据</param> /// <param name="lineNum">每行多少字节,默认16字节</param> /// <param name="addr">数据存储的起始地址</param> /// <returns></returns> private string[] SaveHexLine(byte[] val, int lineNum = 16, long addr = 0) { List <string> _return = new List <string>(); //判断每行的数据是否过大或者不能被16整除 if ((lineNum > 0xFF) || ((lineNum % 16) != 0)) { lineNum = 16; } //---进行分行处理,计算最大多少行 long lineCount = (val.Length / lineNum); //---如果不是整数行,将其设置为整数行 if ((val.Length % lineNum) != 0) { lineCount += 1; } //---校验是大文件,添加拓展线性地址,线性地址是0 if (val.Length > 65536) { //---拓展段地址 _return.Add(CHexLine.ToHexLineExternSegmentAddrRecord(0)); } //---数据地址 long baseAddr = addr; //---数据保存处理 for (long i = 0; i < lineCount; i++) { string temp = ""; //---计算当前数据行的数据 int byteCount = (int)(((val.Length - i * lineNum) > lineNum) ? lineNum : (val.Length - i * lineNum)); //---当前行数据 byte[] lineVal = new byte[byteCount]; //---拷贝数据 Array.Copy(val, i * lineNum, lineVal, 0, lineVal.Length); //---数据空间64K检查 if (((baseAddr % 65536) == 0) && (baseAddr != 0)) { //---对65536求整处理 long externLineAddr = (baseAddr / 65536); //---拓展段地址 //temp = CHexLine.ToHexLineExternLineAddrRecord(externLineAddr); temp = CHexLine.ToHexLineExternSegmentAddrRecord(externLineAddr); _return.Add(temp); } //---本次数组的内容为0xFF,则跳过,否则写入数据 if (CGenFuncEqual.GenFuncEqual(lineVal, 0xFF) == false) { //---保存数据记录文件 temp = CHexLine.ToHexLineDataRecord((baseAddr & 0xFFFF), lineVal); _return.Add(temp); } //---计算地址偏移 baseAddr += lineNum; } return(_return.ToArray()); }
/// <summary> /// 扩展段地址 /// </summary> /// <param name="addr"></param> /// <returns></returns> public static string ToHexLineExternSegmentAddrRecord(long addr) { string _return = ""; byte[] line = new byte[2] { (byte)((addr >> 8) & 0xFF), (byte)(addr & 0xFF) }; _return = CHexLine.ToHexLine(0, HexType.EXTEND_SEGMENT_ADDRESS_RECORD, line); return(_return); }
/// <summary> /// /// </summary> //~CHexFile() //{ // //if ((this.defaultCHexLine != null) || (this.defaultCHexLine.Count > 0)) // //{ // // GC.SuppressFinalize(this.defaultCHexLine); // //} // GC.SuppressFinalize(this); //} #endregion #region 公共函数 /// <summary> /// 解析Hex文件数据 /// </summary> /// <param name="filePath"></param> /// <returns></returns> public bool AnalyseHexFile(string filePath) { //---检查文件是否存在 if (!File.Exists(filePath)) { this.defaultLogMessage = "Hex文件不存在!\r\n"; return(false); } try { //---读取文件 using (StreamReader std = new StreamReader(filePath)) { long i = 0; if ((this.defaultCHexLine == null) || (this.defaultCHexLine.Count == 0)) { this.defaultCHexLine = new List <CHexLine>(); } else { this.defaultCHexLine.Clear(); } while (std.Peek() >= 0) { i++; //---读取一行的数据 string readline = std.ReadLine(); //---每行数据创建一个对象 CHexLine readHexLine = new CHexLine(readline); //---判断数据的读取是否有效 if (readHexLine.IsOK) { this.defaultCHexLine.Add(readHexLine); } else { this.defaultLogMessage = "第" + i.ToString() + "行" + "的数据解析错误!" + readHexLine.LogMessage + "\r\n"; return(false); } Application.DoEvents(); } } } catch { this.defaultLogMessage = "Hex文件解析错误!\r\n"; return(false); } //---计算地址信息 this.CalcAddr(); //---获取数据信息 this.defaultDataMap = this.GetHexFileDataMap(); //---返回结果 return(true); }
/// <summary> /// 将指定的数据保存为Hex数据行 /// </summary> /// <param name="val"></param> /// <returns></returns> public string[] SaveHexLine(byte[] val) { List <string> hexFile = new List <string>(); //---保存数据记录行 hexFile.AddRange(this.SaveHexLine(val, 16, 0)); //---添加数据结束行 hexFile.Add(CHexLine.ToHexLineEndOfFileRecord()); //---返回结果 return(hexFile.ToArray()); }
/// <summary> /// 扩展线性地址 /// </summary> /// <param name="addr"></param> /// <returns></returns> public static string ToHexLineExternLineAddrRecord(long addr) { string _return = ""; /* * addr <<= 24; * byte[] line = new byte[2] { (byte)((addr >> 8) & 0xFF), (byte)(addr & 0xFF) }; * _return = CHexLine.ToHexLine(0, HexType.EXTEND_LINEAR_ADDRESS_RECORD, line); */ byte[] line = new byte[2] { (byte)((addr >> 8) & 0xFF), (byte)(addr & 0xFF) }; _return = CHexLine.ToHexLine(0, HexType.EXTEND_LINEAR_ADDRESS_RECORD, line); return(_return); }
/// <summary> /// 将指定的数据保存为Hex文件 /// </summary> /// <param name="val">数据</param> /// <param name="num">每行字节数</param> /// <param name="addr">存储起始地址</param> /// <param name="isHighFirst">true---给定的数据是高位在前,false---给定的数据是地位在前</param> /// <returns></returns> public string SaveHexFile(byte[] val, int num = 16, long addr = 0, bool isHighFirst = false) { string _return = ""; //---如果给定的数据是高位在前,需要将数据转换为低位在前,Hex文件默认是低位在前高位在后的格式 if (isHighFirst == true) { } //---获取数据行 string[] hexLineTemp = this.SaveHexLine(val, num, addr); //---校验数据记录行数据保存的记过 if ((hexLineTemp == null) || (hexLineTemp.Length == 0) || (hexLineTemp.Length == 1)) { this.defaultLogMessage = "转存Hex文件错误"; return(null); } //---数据记录行的信息 if ((this.defaultCHexLine != null) || (this.defaultCHexLine.Count > 0)) { //---清零操作 this.defaultCHexLine.Clear(); } else { this.defaultCHexLine = new List <CHexLine>(); } //---填充数据行 for (int i = 0; i < hexLineTemp.Length; i++) { //---每行数据创建一个对象 CHexLine readHexLine = new CHexLine(hexLineTemp[i]); //---判断数据的读取是否有效 if (readHexLine.IsOK) { this.defaultCHexLine.Add(readHexLine); _return += hexLineTemp[i]; } else { this.defaultLogMessage = "Hex转存发生错误,错误提示" + readHexLine.LogMessage; break; } } //---保存为数据行,数据结束行 _return += CHexLine.ToHexLineEndOfFileRecord(); //---返回Hex文件记录 return(_return); }
/// <summary> /// 解析Hex文件数据 /// </summary> /// <param name="filePath"></param> /// <returns></returns> public virtual bool AnalyseHexFile(string filePath) { //---检查文件是否存在 if (!File.Exists(filePath)) { this.defaultLogMessage = "Hex文件不存在!\r\n"; return(false); } try { using (StreamReader std = new StreamReader(filePath)) { long i = 0; if ((this.defaultCHexLine == null) || (this.defaultCHexLine.Count == 0)) { this.defaultCHexLine = new List <CHexLine>(); } else { this.defaultCHexLine.Clear(); } while (std.Peek() >= 0) { i++; //---读取的数据 string readline = std.ReadLine(); //---每行数据创建一个对象 CHexLine readHexLine = new CHexLine(readline); //---判断数据的读取是否有效 if (readHexLine.IsOK) { this.defaultCHexLine.Add(readHexLine); } else { this.defaultLogMessage = "第" + i.ToString() + "行" + "的数据解析错误!" + readHexLine.LogMessage + "\r\n"; return(false); } } } } catch { this.defaultLogMessage = "Hex文件解析错误!\r\n"; return(false); } return(true); }
/// <summary> /// 将指定的数据保存为Hex文件 /// </summary> /// <param name="val"></param> /// <returns></returns> public string SaveHexFile(byte[] val) { List <string> hexFile = new List <string>(); //---保存数据记录行 hexFile.AddRange(this.SaveHexLine(val, 16, 0)); //---添加数据结束行 hexFile.Add(CHexLine.ToHexLineEndOfFileRecord()); string _return = ""; foreach (string str in hexFile) { _return += str; } return(_return); }
/// <summary> /// 记录行 /// </summary> /// <param name="addr"></param> /// <param name="buffer"></param> /// <returns></returns> public static string ToHexLineDataRecord(long addr, byte[] buffer) { return(CHexLine.ToHexLine(addr, HexType.DATA_RECORD, buffer)); }