/// <summary> /// 字数据 /// </summary> /// <param name="val"></param> /// <param name="isHighFirst"></param> /// <returns></returns> public int[] GetHexFile(bool isHighFirst = false) { //---获取当前数据 byte[] bufferMap = GetHexFile(0xFF); //---创建缓存区 int[] _return = new int[bufferMap.Length / 2]; //---填充数组为指定的数据 HexFile.memset(ref _return, _return.Length, 0xFFFF); //---将数据转换成Int数组 int i = 0; for (i = 0; i < _return.Length; i++) { if (isHighFirst) { //---高字节在前 _return[i] = bufferMap[2 * i + 1]; _return[i] = (_return[i] << 8) + bufferMap[2 * i]; } else { //---低字节在前 _return[i] = bufferMap[2 * i]; _return[i] = (_return[i] << 8) + bufferMap[2 * i + 1]; } } return(_return); }
/// <summary> /// 将给定的数据保存为HEX数据行 /// </summary> /// <param name="addr"></param> /// <param name="val"></param> /// <param name="num"></param> /// <returns></returns> public static string[] ToHexFileLine(long addr, byte[] val, int num) { List <string> _return = new List <string>(); //判断每行的数据是否过大或者不能被16整除 if ((num > 0xFF) || ((num % 16) != 0)) { num = 16; } //---进行分行处理 long lineCount = (val.Length / num); //---求整数处理 if ((val.Length % num) != 0) { lineCount += 1; } //---数据保存处理 for (long i = 0; i < lineCount; i++) { string temp = ""; //---计算当前数据行的数据 int byteCount = (int)(((val.Length - i * num) > num) ? num : (val.Length - i * num)); //---当前行数据 byte[] lineVal = new byte[byteCount]; //---拷贝数据 Array.Copy(val, i * num, lineVal, 0, lineVal.Length); //---计算地址 long baseAddr = addr + i * num; //---数据空间64K检查 if (((baseAddr % 65536) == 0) && (baseAddr != 0)) { //---对65536求整处理 long externLineAddr = (baseAddr / 65536); temp = HexLine.ToHexLineExternLineAddrRecord(externLineAddr); _return.Add(temp); temp = string.Empty; } //---本次数组的内容为0xFF,则跳过 if (HexFile.equal(lineVal)) { continue; } else { //---保存数据记录文件 temp = HexLine.ToHexLineDataRecord((baseAddr & 0xFFFF), lineVal); _return.Add(temp); } } return(_return.ToArray()); }
/// <summary> /// 保存为HEX文件 /// </summary> /// <param name="addr"></param> /// <param name="val"></param> /// <param name="num"></param> /// <returns></returns> public static string ToSaveHexFile(long addr, byte[] val, int num) { string _return = ""; //---获取数据行 string[] temp = HexFile.ToHexFileLine(addr, val, num); if (temp == null) { return(null); } //---填充数据行 int i = 0; for (i = 0; i < temp.Length; i++) { _return += temp[i]; } //---保存为数据行 _return += HexLine.ToHexLineEndOfFileRecord(); return(_return); }
/// <summary> /// 保存为HEX文件 /// </summary> /// <param name="val"></param> /// <returns></returns> public static string ToSaveHexFile(byte[] val) { return(HexFile.ToSaveHexFile(0, val, 16)); }
/// <summary> /// 保存为HEX文件 /// </summary> /// <param name="val"></param> /// <param name="num"></param> /// <returns></returns> public static string ToSaveHexFile(byte[] val, int num) { return(HexFile.ToSaveHexFile(0, val, num)); }
/// <summary> /// 获取解析后的数据 /// </summary> /// <param name="length"></param> /// <returns></returns> public byte[] GetHexFile(long length) { //---创建缓存区 byte[] _return = new byte[length]; if (_return == null) { return(null); } //---用指定的数据填充缓存区 HexFile.memset(ref _return, length, 0xFF); //---初始化数据的地址 long baseAddr = this.m_BeginAddr; //---将解析后的数据填充到数据缓存区 int i = 0; for (i = 0; i < base.Count; i++) { byte[] buffer = null; //---数据类型的解析 switch (base[i].m_HexType) { case HexType.DATA_RECORD: //---拷贝数据 Array.Copy(base[i].m_HexByte, 0, _return, (baseAddr + base[i].m_Addr), base[i].m_Length); break; case HexType.END_OF_FILE_RECORD: break; case HexType.EXTEND_SEGMENT_ADDRESS_RECORD: //---获取数据的地址 buffer = new byte[2] { base[i].m_HexByte[1], base[i].m_HexByte[0] }; baseAddr = BitConverter.ToUInt16(buffer, 0); baseAddr <<= 4; break; case HexType.START_SEGMENT_ADDRESS_RECORD: //---获取数据的地址 buffer = new byte[4] { base[i].m_HexByte[3], base[i].m_HexByte[2], base[i].m_HexByte[1], base[i].m_HexByte[0] }; baseAddr = BitConverter.ToUInt32(buffer, 0); baseAddr <<= 4; break; case HexType.EXTEND_LINEAR_ADDRESS_RECORD: //---获取数据的地址 buffer = new byte[2] { base[i].m_HexByte[1], base[i].m_HexByte[0] }; baseAddr = BitConverter.ToUInt16(buffer, 0); baseAddr <<= 16; break; case HexType.START_LINEAR_ADDRESS_RECORD: //---获取数据的地址 buffer = new byte[4] { base[i].m_HexByte[3], base[i].m_HexByte[2], base[i].m_HexByte[1], base[i].m_HexByte[0] }; baseAddr = BitConverter.ToUInt32(buffer, 0); break; default: return(null); } } return(_return); }