HEX转BIN格式与HEX文件CRC校验

HEX文件格式

行开始长度地址类型数据校验
:LLDDDDTTDD…DDCC
1B1B2B1BnB1B
  • 行开始: 固定为:

  • 长度: 数据字段的字节数

  • 地址: 存储地址

  • 类型:

    • 00: 数据标识
    • 01: 文件结束标识
    • 02: 拓展段标识
    • 03: 起始段地址标识
    • 04: 扩展线性地址标识
    • 05: 起始线性地址标识
  • 校验: CheckSum = 0x100 - (Sum & 0xFF)

python脚本

pip install crc
from crc import Configuration, Register

def hex_to_bin(hex_file_path: str, bin_file_path: str):
    """将 HEX 文件转换为 BIN 文件"""
    with open(hex_file_path, 'r') as hex_file, open(bin_file_path, 'wb') as bin_file:
        for line in hex_file:
            if line.startswith(':'):
                data_length = int(line[1:3], 16)  # 数据长度
                address = int(line[3:7], 16)      # 地址(可以用于其他目的,但这里不使用)
                record_type = int(line[7:9], 16)  # 记录类型
                data = line[9:9 + data_length * 2]  # 数据部分
                checksum = int(line[9 + data_length * 2:11 + data_length * 2], 16)  # 校验和
                # 只处理数据记录
                if record_type == 0:
                    # 转换十六进制数据为字节并写入 BIN 文件
                    bin_file.write(bytes.fromhex(data))

def compute_crc_for_bin_file(bin_file_path: str) -> int:
    # 创建 CRC16-CCITT 对象,使用默认参数
    config = Configuration(
        width=16,
        polynomial=0x1021,
        init_value=0x0000,
        final_xor_value=0x0000,
        reverse_input=True,
        reverse_output=True,
    )
    calculator = Register(config)
    calculator.init()
    with open(bin_file_path, 'rb') as file:
        while (data := file.read(1024)):  # 每次读取1024字节
            calculator.update(data)
    return calculator.digest()

def compute_crc_for_hex_file(hex_file_path: str) -> int:
    config = Configuration(
        width=16,
        polynomial=0x1021,
        init_value=0x0000,
        final_xor_value=0x0000,
        reverse_input=True,
        reverse_output=True,
    )
    calculator = Register(config)
    calculator.init()
    with open(hex_file_path, 'r') as hex_file:
        for line in hex_file:
            if line.startswith(':'):
                data_length = int(line[1:3], 16)  # 数据长度
                address = int(line[3:7], 16)      # 地址(可以用于其他目的,但这里不使用)
                record_type = int(line[7:9], 16)  # 记录类型
                data = line[9:9 + data_length * 2]  # 数据部分
                checksum = int(line[9 + data_length * 2:11 + data_length * 2], 16)  # 校验和
                if record_type == 0:
                    calculator.update(bytes.fromhex(data))
    return calculator.digest()

def main():
    hex_file_path = r"C:\Users\Desktop\1234.hex"  # 替换为您的 HEX 文件路径
    bin_file_path = r"C:\Users\Desktop\1234.bin"  # 输出的 BIN 文件路径
    
    # 计算hex的CRC
    crc_result = compute_crc_for_hex_file(hex_file_path)
    print(f"CRC16-CCITT 校验码: {crc_result:04X}")

    # 执行转换
    hex_to_bin(hex_file_path, bin_file_path)
    print(f"HEX 文件 {hex_file_path} 已成功转换为 BIN 文件 {bin_file_path}")

    # 计算bin的CRC
    crc_result = compute_crc_for_bin_file(bin_file_path)
    print(f"CRC16-CCITT 校验码: {crc_result:04X}")

if __name__ == "__main__":
    main()
### 回答1: 在嵌入式系统开发中,常常需要将程序代hex文件的形式烧录到芯片中。但有些情况下,需要将hex文件换为bin文件,并对bin文件进行校验,以保证程序的正确性和稳定性。 hex文件是一种十六进制代文件,通常用来描述程序代在内存中的地址和数据。而bin文件则是指包含机器代的二进制文件,它们被烧录到芯片中执行。 将hex文件换为bin文件通常需要使用专门的工具,如hex2bin,可实现hex文件格式bin文件格式换。在换的过程中,需要注意启始地址和数据段的长度等参数设置,以保证换的正确性。 换完毕后,还需对bin文件进行校验。常用的校验方式有两种:CRC校验和和MD5校验。 CRC校验和是通过对bin文件中所有数据的和进行计算的一种校验方式,具有计算速度快、校验结果可靠等优点,但其缺点是容易受到数据重复或篡改的影响。 MD5校验是一种基于哈希算法的校验方式,它通过对bin文件中的数据进行一系列的数学计算,得出一个固定长度的校验,并与预设的校验进行比较,从而判断数据的完整性和正确性。MD5校验具有高度的安全性,能够有效地检测数据的篡改和错误,但其计算时间比较长。 因此,在对bin文件进行校验时,需要权衡计算速度和校验安全度等因素,选择合适的校验方式。 ### 回答2: Hex文件Bin文件是常见的嵌入式开发中所使用的文件格式,通常使用HEX文件对程序中的数据和程序进行存储和传输,而使用BIN文件则更经常的被用来记录数据和过程状态。在Hex文件Bin文件之间进行换是很常见的操作,而在换之后进行校验则是十分必要的。 对于Hex文件Bin文件之间的换,通常可以通过使用相关的文件换工具进行完成,比如说使用MPSSE通过USB接口将Hex文件换为Bin文件。另外,也可以通过对HEX文件进行解析,获取里面的编,然后将其翻译为对应的字符数据而获得Bin文件。这些工具也会在换的过程中对文件进行CRC32的校验,以确保文件换后的数据的正确性。 而对于Hex文件Bin文件的校验,则需要对换后的数据进行两个方面的检查。首先,需要对文件的功能性进行测试,如果是程序代,那么需要将Bin文件烧录至MCU中并验证运行的程序是否正确;如果是数据文件,需要验证文件的内容是否正确。另一方面,则是需要对文件的完整性进行校验,这可以通过CRC32或MD5等算法进行计算验证,以确保文件换和传输过程中没有发生数据损坏或丢失。 总的来说,Hex文件Bin文件换和校验是软件开发中不可避免的步骤,可以通过使用工具来自动完成换,但对于校验部分则需要进行一定的手动操作。这也说明了文件换和校验的重要性,只有确保文件的正确性和完整性,才能保证后续开发和调试过程的正常进行。 ### 回答3: 将hex文件换成bin文件是很容易的,只需要一个十六进制编辑器即可完成,但是加上校验则需要更多的处理。 首先,我们需要将hex文件中的每个16进制数换成二进制形式,并将它们按照顺序连接起来。这个过程可以通过程序自动完成。 接下来,我们需要计算校验和。校验和是指将所有数据相加(不包括头部和结尾的标识符),再对其进行取反,得到的值就是校验和。 最后,我们需要将换后的二进制数据和校验和合并成一个二进制文件。这个过程也可以通过程序自动完成。 需要注意的是,在换过程中要注意文件的编格式,以避免在处理过程中产生编问题。同时,也要注意校验和的计算方式,以确保校验和的正确性。 在完成以上步骤后,我们就可以得到一个包含了二进制数据和校验和的bin文件。这个文件可以被用于一些需要校验和的应用中,确保数据的完整性和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tangYi0_0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值