/// <summary> /// 行字符串转换为结构体 /// </summary> public HexTextOneLine StringToDataStruct(string str) { HexTextOneLine oneLine = new HexTextOneLine(); //所有数据的字节集合 oneLine.allBytes = Converter.MyStringConverter.HexStringToBytes("0x" + str.Substring(1, str.Length - 1)); //标明数据长度 oneLine.dataLength = Convert.ToByte("0x" + str.Substring(1, 2), 16); //偏移地址 oneLine.addr = Converter.MyStringConverter.HexStringToUint("0x" + str.Substring(3, 4)); //实际数据转换成字节,每四个组成一个数据地址,高字节在前 oneLine.data = Converter.MyStringConverter.HexStringToBytes("0x" + str.Substring(9, (int)(oneLine.dataLength * 2))); //数据类型 oneLine.dataType = (ENUM_HexDATA_TYPE)Convert.ToInt32(str.Substring(7, 2)); //校验和 oneLine.checkSum = oneLine.allBytes[oneLine.allBytes.Length - 1]; //实际计算所得校验和 oneLine.realCheckSum = 0x00; for (int i = 0; i < oneLine.allBytes.Length - 1; i++) { oneLine.realCheckSum += oneLine.allBytes[i]; } oneLine.realCheckSum = (byte)(0x01 + ~oneLine.realCheckSum); return(oneLine); }
/// <summary> /// 将一行数据转换成string /// </summary> public string DataStructToString(HexTextOneLine oneLine) { string str = string.Empty; //显示地址是实际地址的2倍 str = ":"; //数据高位在前 for (int i = 0; i < oneLine.allBytes.Length; i++) { str += oneLine.allBytes[i].ToString("X2"); } return(str); }
/// <summary> /// 解析某一行字符串 /// </summary> public List <HexParseDataOneAddrStruct> ParseOnRow(string str, int lineNum) { List <HexParseDataOneAddrStruct> oneRowData = new List <HexParseDataOneAddrStruct>(); //:10 0030 00 60030000 24030000 60030000 60030000 70 //:02 0000 04 0005 F5 //:00 0000 01 FF HexTextOneLine oneLine = StringToDataStruct(str); //实际数据长度的2倍,之所以不用除法,避免出现奇数导致问题 int doubleRealDataLength = (str.Length - 3 - 4 - 2 - 2); #region 异常 //数据长度不一致 if (oneLine.dataLength * 2 != doubleRealDataLength) { HexParseDataOneAddrStruct dataOne = new HexParseDataOneAddrStruct(); dataOne.lineNum = lineNum; dataOne.lengthError = true; oneRowData.Add(dataOne); return(oneRowData); } //校验不通过 if (oneLine.checkSum != oneLine.realCheckSum) { HexParseDataOneAddrStruct dataOne = new HexParseDataOneAddrStruct(); dataOne.lineNum = lineNum; dataOne.checkSumError = true; oneRowData.Add(dataOne); return(oneRowData); } #endregion switch (oneLine.dataType) { case ENUM_HexDATA_TYPE.DATA: { //实际计算所得地址,每一行最多记录16bytes,4组数据;每组占4个地址,4bytes UInt32 realAddr = (m_INHX32_ExtendLinearAddressRecord + m_INHX32_ExtendSegmentAddressRecord + oneLine.addr); int i = 0; //数据高位在前 for (i = 0; i <= oneLine.data.Length - 4; i += 4) { HexParseDataOneAddrStruct oneAddr = new HexParseDataOneAddrStruct(); uint tmp = (uint)(oneLine.data[i] << 24) + (uint)(oneLine.data[i + 1] << 16) + (uint)(oneLine.data[i + 2] << 8) + (uint)oneLine.data[i + 3]; oneAddr.data = tmp; //线性地址和段地址 oneAddr.linearOffset = m_INHX32_ExtendLinearAddressRecord; oneAddr.beforeIsLinearOffset = m_LastIsLinearOffset; oneAddr.segmentOffset = m_INHX32_ExtendSegmentAddressRecord; oneAddr.beforeIsSegmentOffset = m_LastIsSegmentOffset; m_LastIsLinearOffset = m_LastIsSegmentOffset = false; //清空,下次就知道这次不是线性或者段地址 //地址 oneAddr.addr = Convert.ToUInt32(oneLine.addr + i); //实际地址由线性地址和段地址以及地址组成 oneAddr.realAddr = Convert.ToUInt32(oneAddr.linearOffset + oneAddr.segmentOffset + oneAddr.addr); //最大程序地址,超过地址可能为配置字或者其它 if (oneAddr.realAddr > HexParseDataOneAddrStruct.maxProgramAddr) { oneAddr.notProgramFlash = true; //非程序存储 } oneAddr.lineNum = lineNum; oneRowData.Add(oneAddr); } //对于剩下的非4个字节数据,末尾填充F if (i < oneLine.data.Length) { HexParseDataOneAddrStruct oneAddr = new HexParseDataOneAddrStruct(); uint tmp = 0; // = (uint)(oneLine.data[i] << 24) + (uint)(oneLine.data[i + 1] << 16) + (uint)(oneLine.data[i + 2] << 8) + (uint)oneLine.data[i + 3]; for (int j = i; j < i + 4; j++) { if (j < oneLine.data.Length) { tmp += (uint)oneLine.data[j] << (8 * (4 - (j - i) - 1)); } else { tmp += (uint)0xFF << (8 * (4 - (j - i) - 1)); } } oneAddr.data = tmp; //线性地址和段地址 oneAddr.linearOffset = m_INHX32_ExtendLinearAddressRecord; oneAddr.beforeIsLinearOffset = m_LastIsLinearOffset; oneAddr.segmentOffset = m_INHX32_ExtendSegmentAddressRecord; oneAddr.beforeIsSegmentOffset = m_LastIsSegmentOffset; m_LastIsLinearOffset = m_LastIsSegmentOffset = false; //清空,下次就知道这次不是线性或者段地址 //地址 oneAddr.addr = Convert.ToUInt32(oneLine.addr + i); //实际地址由线性地址和段地址以及地址组成 oneAddr.realAddr = Convert.ToUInt32(oneAddr.linearOffset + oneAddr.segmentOffset + oneAddr.addr); //最大程序地址,超过地址可能为配置字或者其它 if (oneAddr.realAddr > HexParseDataOneAddrStruct.maxProgramAddr) { oneAddr.notProgramFlash = true; //非程序存储 } oneAddr.lineNum = lineNum; oneRowData.Add(oneAddr); } } break; case ENUM_HexDATA_TYPE.END: m_LastIsLinearOffset = m_LastIsSegmentOffset = false; //清空,下次就知道这次不是线性或者段地址 break; case ENUM_HexDATA_TYPE.ExtendSegmentAddressRecord: //段地址,左移4位 { UInt32 segAddr = 0; segAddr = Convert.ToUInt32((oneLine.data[0] << 8) + oneLine.data[1]); //地址高位在前 m_INHX32_ExtendSegmentAddressRecord = (segAddr << 4); m_LastIsSegmentOffset = true; //下次即知此次为段地址 } break; case ENUM_HexDATA_TYPE.ExtendLinearAddressRecord: //线性地址,左移16位 { UInt32 lineAddr = 0; lineAddr = Convert.ToUInt32((oneLine.data[0] << 8) + oneLine.data[1]); //地址高位在前 m_INHX32_ExtendLinearAddressRecord = (lineAddr << 16); //显示地址为实际地址的2倍 m_LastIsLinearOffset = true; //下次即知此次为线性地址 } break; } return(oneRowData); }