Hex文件校验生成和验证

关注+星标公众,不错过精彩内容

编排 | strongerHuang

微信公众号 | 嵌入式专栏

手机升级系统,下载完系统都会存在一个校验过程:

其实,在MCU升级过程中,也是需要校验hex文件,如果要想升级更可靠,还可以在hex或bin升级文件后再增加校验信息。

我们之前公司做的一个远程升级的产品,就是在升级文件之后增加了CRC16校验信息,在接收完整个升级文件之后,进行校验,这样做的目的就是使升级更可靠。

今天来讲讲hex文件的校验和验证校验的内容。

关于Hex

hex 格式文件由 Intel 制定的一种十六进制标准文件格式,是由编译器转换而成的一种用于下载到处理器里面的ASCII文本文件。

1.解释

维基百科解释

https://en.wikipedia.org/wiki/Intel_HEX

Intel HEX is a file format that conveys binary information in ASCII text form. It is commonly used for programming microcontrollers, EPROMs, and other types of programmable logic devices. In a typical application, a compiler or assembler converts a program's source code (such as in C or assembly language) to machine code and outputs it into a HEX file. The HEX file is then imported by a programmer to "burn" the machine code into a ROM, or is transferred to the target system for loading and execution.

Keil官网解释

https://www.keil.com/support/docs/1584/

The Intel HEX file is an ASCII text file with lines of text that follow the Intel HEX file format. Each line in an Intel HEX file contains one HEX record. These records are made up of hexadecimal numbers that represent machine language code and/or constant data. Intel HEX files are often used to transfer the program and data that would be stored in a ROM or EPROM. Most EPROM programmers or emulators can use Intel HEX files.

2.格式

hex行格式:

:BBAAAATT 【D···D】CC

其中:

代表行开始,固定为冒号:

BB代表Bytes,数据长度

AAAA代表Address,地址

TT代表Type,数据类型(标识)

D···D代表Date,数据

CC代表CheckSum,校验和

说明:

BB数据长度,也就是D···D这个字段的数据长度;

AAAA地址,起始地址、偏移地址,根据数据类型(TT)有关;

TT数据类型(标识):

  • 00:数据标识

  • 01:文件结束标识

  • 02:扩展段地址

  • 04:线性地址

  • 05:线性开始地址

(地址代表高16位地址,也就是要向左移16bit)

CC校验和计算公式:

CheckSum = 0x100 - (Sum & 0xFF)

实例描述Hex

下面通过一个例子来说明hex。

说明一下:不同数据类型的数据略有差异,先再看下00(数据类型)的格式:

一个常见hex文件:

:020000040800F2
:1000000000040020B1010008FD020008BD02000844
:10001000F902000801020008350400080000000091
:1000200000000000000000000000000021030008A4
···省略数行
:100470000000024084040008000000200004000086
:040480004804000824
:040000050800019955
:00000001FF

1.04类型:线性地址行

:020000040800F2

02:数据长度,这里是(0800)地址的2字节长度;

0000:偏移地址,这里数据其实无效;

04:线性地址数据类型;

0800:线性起始地址,左移16位,即:0x0800 0000;

F2:校验和

F2 =  0x100 - (0x02 + 0x04 + 0x08);

比如,修改起始地址为0600:

2.00类型:数据行

:1000000000040020B1010008FD020008BD02000844

10:数据长度,这里是16字节(程序)数据的长度;

0000:偏移地址,数据第一行偏移0000地址,第二行就是偏移0010,第二行就是偏移0020,依次偏移到FFF0;

如果偏移到FFF0,则会重新下一个起始地址,一段程序你就明白了:

:10FFD000D0C5CFA20D0A00003052010810B50A4862
:10FFE00002F0FEFC09A002F0FBFC14A002F0F8FCF9
:10FFF0001EA221A123A002F0F3FC2CA002F0F0FC31
:020000040801F1
:10000000394802F0EDFC10BD3C5301080D0A2A20CE
:1000100020202020202020202020202020202020E0
:100020002020202020202020202020414756D6C7F5

00:线性地址数据类型;

00040020B1010008FD020008BD020008:程序数据,就是bin文件里面的纯程序数据;

44:校验和

44 =  0x100 - (0x10 + 0x04 + 0x20 + 0xB1 + 0x01 + 0x08 + 0xFD + 0x02 + 0x08 + 0xBD + 0x02 + 0x08 + 0x44) & 0xFF;

3.01类型:文件结束行

:00000001FF

00:数据长度;

0000:偏移地址,这里数据其实无效;

01:代表文件结束

FF:校验和

这里代表hex文件结束了,有些公司为了使hex传输(下载)更可靠,或通过工具(或命令在)结束行后面追加校验信息,一般远程升级会考虑更多校验信息(后期抽时间讲述一下远程升级)。

更多细节内容,可以参看链接:

https://www.keil.com/support/docs/1584/

https://www.kanda.com/blog/microcontrollers/intel-hex-files-explained/

(公号不支持外链接,请复制链接到浏览器打开)

看到这里,我相信很多人都能写一个脚本工具,让hex转为bin文件(后面抽空给大家讲述一下hex和bin转换的工具)。

Hex校验测试代码

Hex实际占用存储区大小计算办法:

Hex实际大小=文件结束标志前面一条记录的存储起始地址+这条记录的有效数据长度。

下面算法实现hex行的校验,校验成功返回1,失败返回0:

bit AnalyseHEX(char hex[],int len)
{
  unsigned char i=1;
  unsigned char data;
  int cc=0;
  char temp[2];
  do
  {
      temp[0] = hex[i++];
      temp[1] = hex[i++];
      sscanf(temp,"%x",&data);
      cc += data;
  } while (i<(len-2));
  cc%=256;
  cc=0x100-cc;
  temp[0] = hex[i++];
  temp[1] = hex[i++];
  sscanf(temp,"%x",&data);
  return (cc==data)?1:0;
}

当然,实现的算法可以各式各样,按照原理实现即可。

更多关于升级文件的内容,可以参看文章:轻松理解bin、hex、axf和elf文件格式

免责声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

------------ END ------------

后台回复『文件格式』『科普知识』阅读更多相关文章。

欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

欢迎关注我的视频号:

点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,Hex文件是一种十六进制代码文件格式,可以用于将程序或数据写入微控制器、EPROM或其他设备。在实际应用中,Hex文件不仅用于将代码下载到芯片中,也可以用于数据存储、调试等,因此Hex文件一直是嵌入式系统开发中不可或缺的一部分。 其次,Hex文件校验和是保障文件传输过程中数据完整性的重要手段,常用的校验算法有CRC、MD5、SHA等。在Hex文件中,校验和是通过将文件内容中每个字节的十六进制值累加,然后对256取余,取反后得到的结果。 最后,针对Hex文件校验和和内容,可以使用一些工具进行查看和分析。比较常用的工具有WinHexHEX VIEW、Beyond Compare、hexdump等。这些工具可以在Windows、Linux和Mac OS X等操作系统下运行,并能够提供比较直观的Hex文件内容和校验和信息。此外,一些IDE、编译器和调试工具也会内置Hex文件查看功能,如Keil、IAR、CCS等。通过这些工具,可以快速了解Hex文件的结构和内容,从而更好地进行调试和优化。 ### 回答2: Hex文件是一种十六进制格式的文件,其中包含了程序的二进制代码和数据。通常,Hex文件是用于将程序下载到嵌入式设备上的。 而校验和则是用于验证Hex文件是否正确的标准。当我们使用Hex文件下载程序时,校验和可以用来验证下载的程序是否正确地写入嵌入式设备的内存中。 为了计算Hex文件校验和,我们需要用一个校验和工具。校验和工具能够自动计算Hex文件校验和。在计算校验和时,工具会将文件中每一个字节的值相加,并对结果取反,然后输出结果。 此外,还有一些工具可以用来查看Hex文件的内容。这些工具可以以十六进制或ASCII格式显示Hex文件中的内容,使我们能够更好地理解程序代码和数据。 总之,Hex文件校验和是嵌入式系统编程中非常重要的概念。了解如何生成验证和查看Hex文件,以及如何计算校验和,对于嵌入式开发者来说是必不可少的技能。 ### 回答3: Hex文件是一种常见的二进制文件格式,它是一种十六进制表示的可执行文件,常用于嵌入式系统中。在编写嵌入式程序时,经常需要通过将源代码编译后生成Hex文件,再将Hex文件烧录到目标设备上,以实现程序下载和运行。 在生成Hex文件时,通常还会附带一个校验和。校验和是将Hex文件中所有数据的十六进制值相加,并将结果取反后得到的一个校验码。它可以用来验证Hex文件是否被更改或损坏,有助于确保程序的可靠性和安全性。 为了方便查看Hex文件校验和,我们可以使用一些Hex文件校验和查看工具。这些工具可以帮助我们自动计算Hex文件校验和,并将结果展示出来。比如,我们常用的有CRC校验工具、HEX文件校验工具等。 使用Hex文件校验和查看工具,我们可以快速准确地知道Hex文件校验和,确定文件是否完整可靠,以及确保程序的正常运行。这对于嵌入式软件开发和测试等方面都非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值