예제 #1
0
        /// <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());
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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());
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        /// <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);
        }
예제 #7
0
 /// <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);
 }
예제 #8
0
        /// <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);
        }
예제 #9
0
 /// <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));
 }