BIN,S19,M0T,SREC,HEX文件解析;FileParse(二)之源码解析

本文详细介绍了如何使用C#语言解析和生成BIN、S19、M0T、SREC及HEX等MCU刷写格式文件。作者提供了关键代码实现,包括文件的读取、数据处理和校验等功能,适用于不同类型的文件格式转换。源码可供下载,便于学习和参考。

一、摘要

1.描述

  • 本文主要描述的是如何通过使用C#解析常用MCU的刷写格式文件,如Bin,S19,Hex,Mot,Serc。
  • 本软编写的语言是基于C#语言,并未使用其他关联的DLL文件,所以不同的电脑之间兼容性很好,不会出现调用异常的问题。
  • 郑重申明,关于实现方法,我也是从网上很多地方学习而来,大家若觉得版权问题可以联系我随时删除。

2.关键字

文件解析,C#,Bin,S19,Hex,Mot,Serc。

二、为何选择C#解析

  • C#解析文件有很多好用的字符串处理函数,不过其实方式方法都一样,只要知道了解析方法,使用任何语言都是一样轻松的。

三、BIN文件解析

		/*-----define---------------------------------*/
        private const int BLOCK_BUFF_LEN = 83886080;
        private const byte MOT_LINE_LEN = 16;
        private const byte HEX_LINE_LEN = 16;
        /*-----enum and struct------------------------*/
        private class DataInfo_Type
        {
   
   
            internal int len;
            internal uint startAddr;
            internal uint endAddr;
            internal byte[] buff;
        }
        /*-----variable statement---------------------*/
        private readonly List<DataInfo_Type> g_DataInfos = new List<DataInfo_Type>();
		/***********************************************
          * Name    :PushDataInfo
          * Author  :WangHu
          * Function:***
          * Version :V1.0.0
          * Data    :2022.5.20
        ***********************************************/
        private void PushDataInfo(uint? startAddr, uint? endAddr, uint? minStartAddr, uint? maxEndAddr, byte[] p_buff, int len)
        {
   
   
            int m = 0; int n = 0;
            if (minStartAddr == null) {
   
    minStartAddr = 0; }
            if (maxEndAddr == null) {
   
    maxEndAddr = 0xFFFFFFFF; }
            if ((startAddr > maxEndAddr) || (endAddr < minStartAddr)) {
   
    return; }
            if (startAddr < minStartAddr) {
   
    m = (int)(minStartAddr - startAddr); }
            if (endAddr > maxEndAddr) {
   
    n = (int)(endAddr - maxEndAddr); }
            len = len - m - n;
            DataInfo_Type dataInfo = new DataInfo_Type
            {
   
   
                len = len,
                startAddr = (uint)(startAddr + m),
                endAddr = (uint)(endAddr - n),
                buff = new byte[len]
            };
            CommonLib.Copy(dataInfo.buff, p_buff, m, len);
            g_DataInfos.Add(dataInfo);
        }
        
		/***********************************************
          * Name    :AnalysisBinFile
          * Author  :WangHu
          * Function:***
          * Version :V1.0.0
          * Data    :2022.5.20
        ***********************************************/
        private bool AnalysisBinFile(string path, uint? minStartAddr, uint? maxEndAddr)
        {
   
   
            try
            {
   
   
                FileStream file = new FileStream(path, FileMode.Open);
                int lenth = (int)file.Length;
                if (lenth == 0) {
   
    return false; }
                byte[] data = new byte[BLOCK_BUFF_LEN];
                uint? startAddr = minStartAddr;
                if (startAddr == null) {
   
    startAddr = 0; }
                uint? endAddr = (uint?)(startAddr + lenth - 1);
                _ = file.Read(data, 0, lenth);
                PushDataInfo(startAddr, endAddr, minStartAddr, maxEndAddr, data, lenth);
                file.Close();
                return true;
            }
            catch {
   
    return false; }
        }

四、BIN文件生成

		/***********************************************
          * Name    :StorageBinFile
          * Author  :WangHu
          * Function:***
          * Version :V1.0.0
          * Data    :2022.5.20
        ***********************************************/
        private bool StorageBinFile(string path, uint startAddr, byte[] p_buff, int len)
        {
   
   
            try
            {
   
   
                Stream file = new FileStream(path, FileMode.Create);
                BinaryWriter binWriter = new BinaryWriter(file, Encoding.Unicode);
                binWriter.Write(p_buff, (int)startAddr, len);
                binWriter.Close();
                file.Close();
                return true;
            }
            catch {
   
    return false; }
        }

五、S19,M0T,SREC文件解析

		/***********************************************
          * Name    :MotCheckSum
          * Author  :WangHu
          * Function:***
          * Version :V1.0.0
          * Data    :2022.5.20
        ***********************************************/
        private byte MotCheckSum(byte[] buff, int len)
        {
   
   
            byte ret = 0x00;
            for (int i = 0; i < len; i++) {
   
    ret += buff[i]; }
            return (byte)(0xFF - ret);
        }
        
		/***********************************************
          * Name    :AnalysisMotFile
          * Author  :WangHu
          * Function:***
          * Version :V1.0.0
          * Data    :2022.5.20
        *********
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值