窗体界面

在窗体中加入两个button,三个textbox,OpenFileDialog,SaveFileDialog几个控件。如下图所示。

hex文件分析

Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所 构 成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一 个 HEX 记录 。 这 些 记录 由 对应 机器 语 言 码 和/ 或常量 数 据的十六 进 制 编码数 字 组 成。Intel HEX 文件通常用于 传输将 被存于ROM 或者EPROM 中的程序和 数 据。大多 数 EPROM 编 程器或模 拟器使用Intel HEX 文件。

Hex文件是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式由很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。

一般Hex文件通过记事本就可以打开。可以发现一般Hex文件的记录格式如下:

Intel HEX 由任意数量的十六 进 制 记录组 成。每 个记录包含5 个域,它们按以下格式排列:

每一组字母 对应 一 个 不同的域,每一 个 字母 对应 一 个 十六 进 制 编码 的 数 字。每一 个 域由至少 两个 十六 进制 编码数 字 组 成, 它们构 成一 个 字 节 ,就像以下描述的那 样:

:(冒号)每个Intel HEX 记录 都由冒 号开头 ;
LL 是 数 据 长 度域, 它 代表 记录当 中 数 据字 节 (dd) 的 数量 ;
aaaa 是地址域, 它代表 记录当 中 数据的起始地址;
TT是代表HEX 记录类 型的域 , 它 可能是以下 数 据 当 中的一 个:
00 – 数 据 记录(Data Record)
01 – 文件结 束 记录(End of FileRecord)
02 – 扩展段地址 记录(ExtendedSegment Address Record)

03 – 开始段地址 记录(Start Segment Address Record)
04 – 扩展 线 性地址 记录(Extended Linear Address Record)

05 – 开始线性地址 记录(Extended Segment Address Record)
dd 是数 据域 , 它 代表一 个 字 节 的 数 据. 一 个记录 可以有 许 多 数 据字 节 . 记录当 中 数 据字 节 的 数 量必 须 和数 据 长 度域(ll) 中指定的 数字相符.
cc 是校验 和域 , 它 表示 这个记录 的校 验 和. 校 验 和的 计 算是通 过将记录当 中所有十六 进 制 编码数 字 对 的 值相加, 以256 为 模 进 行以下 补 足.

表示为:“:[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和] ”

具体根据记录类型分析如下:

(1)数据记录”00”

Intel HEX文件由任意数 量以回车换行符结束的数据记录组成数据记录外观如下:
:10246200464C5549442050524F46494C4500464C33
其中:10 是这个记录当中 数 据字 节 的 数量.即0x10 ;
2462 是数据 将 被下 载 到存 储 器 当中的地址.即0x2462 ;

00 是记录类型( 数 据 记录).即0x00 ;
464C…464C是 数据.分别代表0x46,0x4C… ;
33 是这个记录的校 验和即0x33;计算方法如下:256D-(10H+24H+62H+00H+46H+4CH+55H+49H+44H+20H+50H+52H+4FH+46H+49H+4CH+45H+00H+46H+4CH)/100H=33H;

(2)文件结束(EOF)”01”

Intel HEX文件必须以文件结束(EOF) 记录结束这个记录的记录类的值必须是01.EOF 记录 外 观总是如下:
:00000001FF
其中:00 是记录当中 数 据字 节 的 数量.
0000 是数据被下载到存储器当中的地址. 在文件结束记录当中地址是没有意义,被忽略的.0000h 是典型的地址;
01 是记录类型 01( 文件 结 束 记录)
FF 是 这个记录 的校 验 和, 计算方法如下: 256D-(00H+00H+00H+01H)=FFH;

(3)扩展线性地址记录(HEX386) ”04”

由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended Linear AddressRecord。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。

扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录含数据的高16位扩展线性地址记录总是有两个数据字节,外观如下:
:02000004FFFFFC

其中:02 是这个记录当中 数 据字 节 的 数量.
0000 是地址域, 对于 扩 展 线 性地址 记录 , 这个 域 总是0000.
04 是记录类型 04( 扩 展 线 性地址 记录)
FFFF 是地址的高16 位.
FC 是这个记录的校 验 和, 计算如下: 256D-(02H+00H+00H+04H+FFH+FFH)/100H=FFH;

当一 个扩展 线 性地址记录被读 取, 存 储于数据域的扩展线性地址被保存,它被应于

从 Intel HEX 文件 读取 来 的 随 后的 记录 . 线 性地址保持有效, 到 它 被另外一 个扩址记录 所改 变。

通 过 把 记录当 中的地址域 与 被移位的 来 自 扩 展 线 性地址 记录 的地址 数 据相加

获 得 数 据 记录 的 绝对 存 储器地址。

以下的例子演示了这个过 程:

:0200000480007A //数据记录的绝对存储器地址高16位为0x8000

:100000001D000A00000000000000000000000000C9

:100010000000000085F170706F0104005D00BD00FC

第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x8000,第二行是DataRecord,里面的地址值是0x0000。那么数据1D000A00000000000000000000000000(共16个字节)要写入FLASH中的地址为 (0x8000<< 16)| 0x0000,也就是写入FLASH的0x80000000这个地址;第三行的数据写入地址为0x80000010.当一个HEX文件的数据超过64k的时候,文件中就会出现多个Extended Linear Address Record。

(4)扩展段地址记录(HEX86)“02“

扩展段地址记录也叫HEX86 记录 , 它包括4-19 位数据地址段. 扩展段地址记总是有两

个数 据字节 , 外观如下:
:020000021200EA
其中:02 是记录当中 数 据字 节 的 数量;
0000 是地址域. 对于 扩 展段地址 记录 , 这个 域 总是0000;
02 是记录类型 02( 扩 展段地址 记录);
1200 是地址段;
EA 是这个记录的校 验 和;

当一 个扩 展段地址 记录 被 读 取, 存 储 于 数 据域的 扩 展段地址被保存, 它 被 应 用于 从 Intel HEX 文件 读 取 来的 随 后的 记录 . 段地址保持有效, 直到 它 被另外一 个扩 展地址 记录 所改 变。

通 过 把 记录当 中的地址域 与 被移位的 来 自 扩 展段地址 记录 的地址 数 据相加 获 得 数 据 记录 的 绝对 存 储器地址。
以下的例子演示了这个过 程…
来自 数 据 记录地址域的地址 2462
扩展段地址 记录数据域 + 1200
---------
绝对存 储 器地址 00014462

Intel HEX 文件例子:
下面是一个 完整的Intel HEX 文件的例子:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244
:10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
:04003F00A42EFE22CB
:00000001FF

byte[] buffer = new byte[1024 * 1024 * 5]; // 打开文件hex to bin缓存
int bufferAdr; // 打开文件hex to bin缓存指针,用于计算bin的长度public void HexFileRead(string filepath)//从指定文件目录读取HEX文件并解析,放入缓存数组buffer中{#region Hex文件解析string szLine;  int startAdr;int endAdr = 0;   //用于判断hex地址是否连续,不连续补充0xFFbufferAdr = 0;if (filepath == ""){return;}FileStream fsRead = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Read);StreamReader HexReader = new StreamReader(fsRead); //读取数据流while (true){szLine = HexReader.ReadLine(); //读取Hex中一行if (szLine == null) { break; } //读取完毕,退出if (szLine.Substring(0, 1) == ":") //判断首字符是”:”{if (szLine.Substring(1, 8) == "00000001") { break; } //文件结束标识if ((szLine.Substring(8, 1) == "0") || (szLine.Substring(8, 1) == "1"))//直接解析数据类型标识为 : 00 和 01 的格式{int lineLenth;string hexString;hexString = szLine.Substring(1, 2);lineLenth = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber); // 获取一行的数据个数值hexString = szLine.Substring(3, 4);startAdr = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber); // 获取地址值for (int i = 0; i < startAdr - endAdr; i++) // 补空位置{hexString = "FF";byte value = byte.Parse(hexString, System.Globalization.NumberStyles.HexNumber);buffer[bufferAdr] = value;bufferAdr++;}for (int i = 0; i < lineLenth; i++) // hex转换为byte{hexString = szLine.Substring(i * 2 + 9, 2);byte value = byte.Parse(hexString, System.Globalization.NumberStyles.HexNumber);buffer[bufferAdr] = value;bufferAdr++;}endAdr = startAdr + lineLenth;}}}#endregion}

效果

源码下载

源码下载地址:https://download.csdn.net/download/qq_29559457/15121782
注意文本框在显示bin文件时,时间比较长,在项目实际开发转换时大家可以屏蔽掉显示,这里只是调试用。

C#窗体应用(二) HEX文件转成BIN文件相关推荐

  1. mot文件解析成bin

    mot固件文件转成bin文件 mot文件介绍 开始解析 mot文件介绍 mot s19 bin hex都可以用于固件文件的存储,其中bin文件就是固件原始数据,只记录固件的二进制数据流,mot文件实际 ...

  2. python能封装成exe文件_python文件封装成*.exe文件(单文件和多文件)

    环境:win10 64位  python3.7 单*.py文件打包 Python GUI:程序打包为exe 一.安装Pyinstaller,命令pip install Pyinstaller,(大写的 ...

  3. aspx文件编译成DLL文件的原理

    前言 Asp.net不是asp的简单升级,而是微软.Net计划中的一个重要组成部分,它依托.Net的多语言与强大的类库支持,引进了服务端HTML控件与WEB控件,自动处理控件的客户端与服务端的 交互, ...

  4. 【转载】把aspx文件编译成DLL文件-.NET教程,Asp.Net开发

    前言 asp.net不是asp的简单升级,而是微软.net计划中的一个重要组成部分,它依托.net的多语言与强大的类库支持,引进了服务端html控件与web控件,自动处理控件的客户端与服务端的 交互, ...

  5. python将txt转换为csv_Python Pandas 三行代码将 txt 文件转换成 csv 文件

    今天需要处理几个比较大的 txt 文件,每个文件都在 2GB 以上,直接用 Excel 将其转换成 csv 文件显然是不太可行的,于是用 Python 中的数据处理神器 Pandas,三行代码就能搞定 ...

  6. bat文件改成sh文件在linux上运行java程序

    最近公司迁移服务器,从windows系统改为linux系统,里面有一些老程序是直接用bat文件启动的. 在linux中需要启动.sh文件才行,所以需要将bat文件改成sh文件才行 先粘出bat文件和s ...

  7. 如何将.keystore 文件转成.key文件

    有的情况下我们需要将如何将.keystore 文件转成.key文件,到底该怎么做呢? 首先我们要知道,用keytool和openssl不可能直接转换的,需要生成一个中间文件,这个就是.pfx. 如何生 ...

  8. 使用matlab将nc文件转成tif文件

    使用matlab将nc文件转换成tif文件 文章目录 使用matlab将nc文件转换成tif文件 一.nc文件是什么? 二.tif文件是什么? 2.直接上代码 一.nc文件是什么? NetCDF全称为 ...

  9. Java实现从Excel文件转换成XML文件(一)

    实现思路:         直接从Excel文件装换成XML文件是可以实现的,这里我采用一个中间装换,也就是先实现excel文件内容放入实现设计好的access数据库文件中,然后再从access中读取 ...

最新文章

  1. 10大NLP精选项目-涉及预训练Bert、知识图谱、智能问答、机器翻译、对话等
  2. 你真的会正确使用日志吗?
  3. smarty 简单分页
  4. 启动白屏处理_App启动优化一顿操作猛如虎
  5. 汽车品牌如何运营用户?
  6. java公司薪酬管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  7. web前端开发课设 html5前端网页设计 中国传统文化介绍
  8. linux命令(3) 链接ln和搜索locate,find, whereis, which, grep命令
  9. 懒人的法宝——办公自动化!
  10. mysql gtid 1236错误_错误1236
  11. 带修莫队 的 小优化 (针对yxc版本)
  12. 广东工业大学数据库课设(点歌系统)
  13. Git使用教程(5)-Git常用命令
  14. 格芯美国芯片厂项目或推迟;​云洲智能撤回IPO申请;节卡机器人完成近10亿元D轮融资 | 每日大事件...
  15. sun.misc.BASE64Encoder详解
  16. 【代码阅读】WarpGAN: Automatic Caricature Generation
  17. TMail电子邮件,TMail放入服务器只需4分钟
  18. 20201127 使用Markdown 画uml图,Graphviz 安装经历吐血整理
  19. 千亿资产路劲掉队 单伟豹无心恋战地产圈?
  20. mysql 统计 打卡数据_第九期30天打卡赠书和红包活动,今天正式启动!

热门文章

  1. python基础 -文件和异常
  2. 全球及中国干膜润滑剂行业研究及十四五规划分析报告
  3. php 默认字符cp936,[原]个人实践+总结:sybase修改默认字符集为cp936
  4. mysql datetime类型精确到毫秒、微秒的问题
  5. java自动换行输出_Java PrintStream.println打印自动换行
  6. 计算机视觉3-> yolov5目标检测1 |从入门到出土
  7. uniapp实现canvas画图
  8. 2021年西式面点师(初级)考试及西式面点师(初级)考试题
  9. github使用Organizations进行团队开发
  10. 处理Unity中使用HTC VIVE PRo的SRWork插件若干问题