一行awk脚本实现hex文件校验和的检验

来源:互联网 发布:python 闭包 编辑:程序博客网 时间:2024/05/22 07:47

Intel HEX文件是用ASCII文本文件形式表示的可直接用文本阅读器读取的16进制格式文件,多用来存放ROM或者EPROM中的程序和数据,可以被多数的烧写程序识别读取并烧写到PROM或FLASH中,大多数EPROM编程器或模拟器使用Intel HEX文件。HEX文件中,每一行包含一个HEX记录,以:做为起始标识,其后面分别为

1字节的数据长度域A

2字节的地址域B

1字节的记录类型域C

数据域D,其字节个数由上面的数据长度域A决定

1字节的校验和域E,校验和的计算是通过将记录域ABCD当中所有十六进制编码字节的值相加和对256进行模除取得。或者说ABCDE域中的全部字节相加的和256进行模除结果应为0.

如下面为从某个hex文件中截取的一段


:10000000120000EA14F09FE514F09FE514F09FE55C
:1000100014F09FE514F09FE514F09FE514F09FE5C0
:100020000001F0316001F031C001F0312002F03107
:100030008002F031E002F0314003F031EFBEADDE7E
:100040000000F0310000F031B456F131DEC0AD0BEC
:1000500000000FE11F00C0E3D30080E300F029E1BE
:100060005304A0E30010A0E3001080E50010E0E3DB
:1000700048039FE5001080E544139FE544039FE596
:10008000001080E540039FE50310A0E3001080E529
:100090000E0000EB9C004FE25C201FE55C301FE58A
:1000A000022043E06C101FE5022080E0F807B0E872
:1000B000F807A1E8020050E1FBFFFFDA7C001FE532


利用1行awk脚本 进行对hex文件的检验,采用的方法是将ABCDE域中的全部字节相加的和256进行模除结果应为0:

方法1:

awk 'BEGIN { i = 1; } { printf("echo -n \"%s \"; ", $0); for (printf("echo $((("), i = 2; i <= length($0) - 3; i += 2) { printf("16#%s+", substr($0, i, 2)); } printf("16#%s)%256))\n", substr($0, length($0) - 1, 2)); }' armboot.hex | sh

方法2:

awk 'BEGIN { i = 1; s = 0; } { printf("%s  ", $0); for (i = 2; i <= length($0) - 3; i += 2) { s += strtonum("0x" substr($0, i, 2)); } s += strtonum("0x" substr($0, length($0) - 1, 2)); printf("%x\n", s % 256); }' armboot.hex

运行实例:

[root@jocks root]# awk 'BEGIN { i = 1; } { printf("echo -n \"%s \"; ", $0); for (printf("echo $((("), i = 2; i <= length($0) - 3; i += 2) { pr
intf("16#%s+", substr($0, i, 2)); } printf("16#%s)%256))\n", substr($0, length($0) - 1, 2)); }' armboot.hex | sh
:10000000120000EA14F09FE514F09FE514F09FE55C 0
:1000100014F09FE514F09FE514F09FE514F09FE5C0 0
:100020000001F0316001F031C001F0312002F03107 0
:100030008002F031E002F0314003F031EFBEADDE7E 0
:100040000000F0310000F031B456F131DEC0AD0BEC 0
:1000500000000FE11F00C0E3D30080E300F029E1BE 0
:100060005304A0E30010A0E3001080E50010E0E3DB 0
:1000700048039FE5001080E544139FE544039FE596 0
:10008000001080E540039FE50310A0E3001080E529 0
:100090000E0000EB9C004FE25C201FE55C301FE58A 0
:1000A000022043E06C101FE5022080E0F807B0E872 0
:1000B000F807A1E8020050E1FBFFFFDA7C001FE532 0

[root@jocks root]# awk 'BEGIN { i = 1; s = 0; } { printf("%s  ", $0); for (i = 2; i <= length($0) - 3; i += 2) { s += strtonum("0x" substr($0, i, 2)); } s += strtonum("0x" substr($0, length($0) - 1, 2)); printf("%x\n", s % 256); }' armboot.hex
:10000000120000EA14F09FE514F09FE514F09FE55C  0
:1000100014F09FE514F09FE514F09FE514F09FE5C0  0
:100020000001F0316001F031C001F0312002F03107  0
:100030008002F031E002F0314003F031EFBEADDE7E  0
:100040000000F0310000F031B456F131DEC0AD0BEC  0
:1000500000000FE11F00C0E3D30080E300F029E1BE  0
:100060005304A0E30010A0E3001080E50010E0E3DB  0
:1000700048039FE5001080E544139FE544039FE596  0
:10008000001080E540039FE50310A0E3001080E529  0
:100090000E0000EB9C004FE25C201FE55C301FE58A  0
:1000A000022043E06C101FE5022080E0F807B0E872  0
:1000B000F807A1E8020050E1FBFFFFDA7C001FE532  0

运行实例输出的每行的最末的0字符说明校验和正确

--本文结束--