求可解析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
相关产品推荐
相关产品推荐

