You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求可解析Intel Hex文件提取数据用于CRC计算的C语言程序

Intel Hex解析与CRC计算的C程序

下面是一个可直接使用的C语言程序,它能读取Intel Hex文件,过滤出**数据记录(记录类型0x00)**并提取有效数据段,同时直接计算这些数据的CRC32值:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define MAX_LINE_LEN 256
#define CRC32_POLY 0xEDB88320

// 更新CRC32值的函数
uint32_t crc32_update(uint32_t crc, const uint8_t *data, size_t length) {
    for (size_t i = 0; i < length; i++) {
        crc ^= data[i];
        for (int j = 0; j < 8; j++) {
            crc = (crc >> 1) ^ ((crc & 1) ? CRC32_POLY : 0);
        }
    }
    return crc;
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "用法: %s <Intel Hex文件路径>\n", argv[0]);
        return 1;
    }

    FILE *fp = fopen(argv[1], "r");
    if (!fp) {
        perror("无法打开文件");
        return 1;
    }

    char line[MAX_LINE_LEN];
    uint32_t total_crc = 0xFFFFFFFF; // CRC32初始值
    uint32_t data_count = 0;

    while (fgets(line, MAX_LINE_LEN, fp)) {
        // 跳过不符合格式的行
        if (line[0] != ':' || strlen(line) < 11) {
            continue;
        }

        // 解析记录字节数
        uint8_t byte_count;
        sscanf(line + 1, "%2hhx", &byte_count);

        // 解析记录地址
        uint16_t addr;
        sscanf(line + 3, "%4hx", &addr);

        // 解析记录类型
        uint8_t record_type;
        sscanf(line + 7, "%2hhx", &record_type);

        // 仅处理数据记录,遇到结束记录直接退出
        if (record_type != 0x00) {
            if (record_type == 0x01) break;
            continue;
        }

        // 提取数据段
        uint8_t data[256];
        for (int i = 0; i < byte_count; i++) {
            sscanf(line + 9 + (i * 2), "%2hhx", &data[i]);
        }

        // 更新CRC与数据统计
        total_crc = crc32_update(total_crc, data, byte_count);
        data_count += byte_count;

        // 可选:取消注释以打印每行提取的数据
        // printf("地址 0x%04X 数据: ", addr);
        // for (int i = 0; i < byte_count; i++) printf("%02X ", data[i]);
        // printf("\n");
    }

    fclose(fp);

    // 生成最终CRC32结果
    total_crc ^= 0xFFFFFFFF;

    printf("提取的有效数据总字节数: %u\n", data_count);
    printf("数据的CRC32值: 0x%08X\n", total_crc);

    return 0;
}

使用说明

  • 编译:gcc intel_hex_crc.c -o intel_hex_crc
  • 运行:./intel_hex_crc your_target_file.hex
  • 若需要其他CRC算法(如CRC16),直接替换crc32_update函数即可
  • 程序默认跳过扩展地址类记录,若需要处理完整32位地址映射,可扩展代码解析0x02/0x04类型记录

内容的提问来源于stack exchange,提问作者varun b.m

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:45:35