android蓝牙通信和Hex文件解析升级

针对蓝牙硬件里的软件程序包HEX文件解析和升级

1、思路
    
    选择手机中的HEX升级包文件,比如(/Download下的 update.hex),
    然后通过java读取文件每一行获取每一行的数据,然后根据HEX文件数据的规则来解析,
    
    hex文件数据:
        
        1
    
    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 以 行 为单位

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
解析hex文件的代码可以分为以下几个步骤: 1. 打开hex文件,读取数据 ``` file = open("test.hex", "r") data = file.readlines() ``` 2. 解析每行数据 ``` for line in data: # 去除换行符 line = line.strip() # 解析行号、数据类型、地址和数据 line_no = int(line[1:3], 16) data_type = int(line[7:9], 16) addr = int(line[3:7], 16) line_data = line[9:-2] # 根据数据类型解析数据 if data_type == 0: # 数据记录 for i in range(0, len(line_data), 2): byte = int(line_data[i:i+2], 16) # 处理数据 elif data_type == 1: # 结束记录 break elif data_type == 2: # 扩展线性地址记录 addr_offset = int(line_data, 16) * 16 elif data_type == 3: # 扩展段地址记录 pass else: # 其他记录类型 pass ``` 3. 处理数据 根据数据类型解析出的数据,可以进行相应的处理。例如,如果是数据记录,可以将数据写入指定的内存地址;如果是扩展线性地址记录,可以计算出偏移地址。 完整的代码示例: ``` file = open("test.hex", "r") data = file.readlines() addr_offset = 0 for line in data: # 去除换行符 line = line.strip() # 解析行号、数据类型、地址和数据 line_no = int(line[1:3], 16) data_type = int(line[7:9], 16) addr = int(line[3:7], 16) + addr_offset line_data = line[9:-2] # 根据数据类型解析数据 if data_type == 0: # 数据记录 for i in range(0, len(line_data), 2): byte = int(line_data[i:i+2], 16) # 处理数据 print(hex(addr), hex(byte)) addr += 1 elif data_type == 1: # 结束记录 break elif data_type == 2: # 扩展线性地址记录 addr_offset = int(line_data, 16) * 16 elif data_type == 3: # 扩展段地址记录 pass else: # 其他记录类型 pass file.close() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漠天515

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值