首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

嵌入式開發實戰:C 語言實現 Bin 檔案轉 Hex 格式(支援 64KB+)

     編輯:關於C

格式差異速覽

特性BinHex (Intel HEX)
內容純二進制機器碼ASCII 文本,含地址、類型、資料、校驗和
地址資訊無,需外部指定偏移每行自帶載入地址
適用場景直接燒錄、反組譯分析通用燒錄器、跨平台傳輸

Intel HEX 記錄結構

:LLAAAATTDD...DDCC
  • : 起始碼
  • LL:資料長度 (Byte)
  • AAAA:載入地址 (Big-endian)
  • TT:記錄類型 (00=資料, 01=結束, 04=擴展線性地址)
  • DD...:資料位元組
  • CC:校驗和 (所有位元組和取反+1)

核心轉換邏輯

  1. 每次讀取 NUMBER_OF_ONE_LINE (預設 0x20=32) 位元組。
  2. 計算當前線性地址,超過 64KB 時插入類型 04 擴展地址記錄。
  3. 編碼為資料記錄 (類型 00),計算校驗和。
  4. 最後寫入結束記錄 (:00000001FF)。

關鍵代碼片段

單行編碼函數

uint16_t BinFormatEncode(uint8_t *dest, HexFormat *p) {
    uint16_t off = 0;
    uint8_t chk = p->len + p->addr[0] + p->addr[1] + p->type;
    off += sprintf((char*)&dest[off], ":%02X%02X%02X%02X", p->len, p->addr[0], p->addr[1], p->type);
    for (int i=0; ilen; i++) {
        off += sprintf((char*)&dest[off], "%02X", p->data[i]);
        chk += p->data[i];
    }
    chk = (~chk) + 1;
    off += sprintf((char*)&dest[off], "%02X", chk);
    return off;
}

主轉換流程

RESULT_STATUS BinFile2HexFile(char *src, char *dest) {
    FILE *in = fopen(src, "rb"), *out = fopen(dest, "w");
    // ... 錯誤檢查 ...
    fseek(in, 0, SEEK_END);
    long fsize = ftell(in);
    fseek(in, 0, SEEK_SET);

    uint32_t addr = 0, high_addr = 0;
    uint8_t bin_buf[32], hex_buf[75];
    HexFormat fmt = { .data = bin_buf };

    while (bytes_read) {
        if ((addr & 0xFFFF0000) != high_addr && high_addr) { // 跨 64KB 邊界
            high_addr = addr & 0xFFFF0000;
            fmt.type = 4; fmt.len = 2;
            fmt.addr[0] = high_addr >> 24; fmt.addr[1] = high_addr >> 16;
            write_record(out, &fmt);
        }
        fmt.type = 0; fmt.len = bytes_read;
        fmt.addr[0] = (addr >> 8) & 0xFF; fmt.addr[1] = addr & 0xFF;
        write_record(out, &fmt);
        addr += bytes_read;
    }
    // 結束記錄
    fmt.type = 1; fmt.len = 0; fmt.addr[0] = fmt.addr[1] = 0;
    write_record(out, &fmt);
    fclose(in); fclose(out);
    return RES_OK;
}

使用方式

bin2hex.exe input.bin output.hex

支援任意大小 Bin 檔,自動處理擴展地址記錄,生成標準 Intel HEX 可直接燒錄。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved