Hex文件校验生成和验证

手机升级系统,下载完系统都会存在一个校验过程:
其实,在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文件格式

(0)

相关推荐

  • 轻松理解bin、hex、axf和elf文件格式

    在嵌入式软件开发中,bin.hex.axf和elf这四种格式的文件很常见.之前我分享的STVP.ST-LINK Utility.STM32CubeProg这些下载编程工具的时候,都用到了bin.hex ...

  • 你了解单片机程序的hex文件吗?它包含哪些信息

    https://m.toutiao.com/is/etkYYex/ 图1 图2 (1)每行都是以冒号开始,这只是一个规范格式. (2)第1行:02表示这一行有两个字节的数据,0800是真正的数据,00 ...

  • pem文件的生成 公钥私钥

    0702pem文件的生成 刚刚的笔记没了,因为电脑蓝屏了,我又没保存.现在再补回. 一开始问题是出在没理解demo里面引用的pem文件.拿来测试)(在demo里先签名,然后紧接着就验签),结果发现,验 ...

  • 软网推荐:文件自动分类 生成分类报告

    是否想了解硬盘某分区中各种文件的分布情况?是否想知道仓储移动盘中收藏的各类文件的占比?光靠Windows 10自身的简单统计功能,恐怕不能让你满意.那么,就借用DiskSorter软件,为磁盘文件进行 ...

  • 接口鉴权之sign签名校验与JWT验证

    优质文章,第一时间送达 作者 |  那一片蓝海 来源 |  urlify.cn/FJjmqa 需求描述: 项目里的几个Webapi接口需要进行鉴权,同接口可被小程序或网页调用,小程序里没有用户登录的概 ...

  • 一文看懂hex文件、bin文件、axf文件的区别

    在STM32开发中,经常会碰到hex文件.bin文件与axf文件,这些都是可以烧写到板子里运行的文件.这三个文件有什么区别呢?在这之前,先来一起回顾一下C语言编译的过程: 编译的过程 在之前的C语言笔 ...

  • python jwt-用于生成和验证JSON Web令牌的python模块

    JSON Web令牌(JWT)是一种紧凑的,URL安全的方法,用于表示要在两方之间转移的声明.JWT中的声明被编码为JSON对象,用作JSON Web签名(JWS)结构的有效负载或JSON Web加密 ...

  • 单片机烧录用的hex文件,文件格式解析

    一hex文件解析hex文件可以通过UltraEdit.Notepad++.记事本等工具打开,用Notepad++打开之后会看到如下数据内容. 使用Notepad++打开后会不同含义的数据其颜色不同.每 ...

  • 单片机下载文件:HEX文件和BIN文件的区别

    单片机程序写好之后,我们都要把程序下载到单片机的内存中,单片机才会按照程序员的逻辑执行命令实现功能.之前也讲过下载单片机的几种方式,比如ISP下载,JTAG下载,下载文件的格式最常见的是hex文件,这 ...

  • 手机扫描文件怎么弄?文件一键生成电子版方法分享

    手机扫描文件怎么弄?现如今随着手机智能的不段发展,我们可以用手机完成的操作,真的是越发的丰富了,不像之前一样仅限于打电话,发信息这些操作了.现在不仅可以用手机完成纸质文件资料拍摄,清晰记录的需求,而且 ...