针对蓝牙硬件里的软件程序包HEX文件解析和升级
1、思路
选择手机中的HEX升级包文件,比如(/Download下的 update.hex),
然后通过java读取文件每一行获取每一行的数据,然后根据HEX文件数据的规则来解析,
hex文件数据:
hex文件规则:HEX文件格式解析_hex是只有256-CSDN博客
https://www.cnblogs.com/blogzhangwei/p/8781183.html
Hex文件格式解析_bin转hex 源代码c-CSDN博客
2、hex文件中数据要注意的有:
比如:
:020000040800F2
:04BFF00003000156F3
:020000040800F2
:10C00000806B002039C1000869F200083DE5000896
:10C0100065F20008B9DA0008F91F01080000000005
:106B20003C2910191729102988E9782A543CF100CA
:040000050800C12509
:00000001FF
格式:
:020000040800F2 , 其实就是字节串: 0x02 0x00 0x00 0x04 0x08 0x00 0xF2
第一个 0x02 为数据长度。
紧跟着后面的0x00 0x00 为地址。
再后面的0x04为数据类型,类型共分以下几类:
'00' Data Record
'01' End of File Record
'02' Extended Segment Address Record
'03' Start Segment Address Record
'04' Extended Linear Address Record
'05' Start Linear Address Record
然后,接着0x04后面的两个 0x00 0x00就是数据。最后一个0xFA是校验码。
解析:也就是说每一行的数据格式是:[数据长度1Byte]、[数据地址2Byte]、[数据类型1Byte]、[数据nByte]、[校验1Byte]
原数据【:020000040800F2】
解析:【02 0000 04 0800 F2】 04是段地址数据行
原数据【:04BFF00003000156F3】
解析:【04 BFF0 00 03000156 F3】 00是有效数据,取的是00后面的4个字节03000156
原数据【:020000040800F2】
解析:【02 0000 04 0800 F2】 04是段地址数据行
原数据【:10C00000806B002039C1000869F200083DE5000896】
解析:【10 C000 00 806B002039C1000869F200083DE50008 96】
C000是偏移地址,00是有效数据,取的是00后面的16(10转16进制)个字节806B002039C1000869F200083DE50008
原数据【:10C0100065F20008B9DA0008F91F01080000000005】
解析:【10 C010 00 65F20008B9DA0008F91F010800000000 05】
C010是偏移地址,00是有效数据,取的是00后面的16(10转16进制)个字节65F20008B9DA0008F91F010800000000
原数据【:106B20003C2910191729102988E9782A543CF100CA】
解析:【10 6B20 00 3C2910191729102988E9782A543CF100 CA】
6B20是偏移地址,00是有效数据,取的是00后面的16(10转16进制)个字节3C2910191729102988E9782A543CF100
原数据【:040000050800C12509】
解析:【04 0000 05 0800C125 09】 05是开始行地址记录,一般不会对05数据处理
原数据【:00000001FF】
解析:【00 0000 01 FF】 01是文件结束标志行
3、文件解析的android端代码:(解析部分重点)
/**
* 解析HEX文件,读取每行并拆解成数据对象(包括第一行段地址)
* @param filePath String
* @return List<FileStruct>
*/
private static List<FileStruct> analysisFile(String filePath) {
File tempFile = new File(filePath);
List<FileStruct> fileStructList = new ArrayList<>();
InputStream inputStream = null;
BufferedReader bufferedReader = null;
try {
inputStream = new FileInputStream(tempFile);
//转成 reader 以 行 为单位