| 特性 | Bin | Hex (Intel HEX) |
|---|---|---|
| 內容 | 純二進制機器碼 | ASCII 文本,含地址、類型、資料、校驗和 |
| 地址資訊 | 無,需外部指定偏移 | 每行自帶載入地址 |
| 適用場景 | 直接燒錄、反組譯分析 | 通用燒錄器、跨平台傳輸 |
:LLAAAATTDD...DDCC
: 起始碼LL:資料長度 (Byte)AAAA:載入地址 (Big-endian)TT:記錄類型 (00=資料, 01=結束, 04=擴展線性地址)DD...:資料位元組CC:校驗和 (所有位元組和取反+1)NUMBER_OF_ONE_LINE (預設 0x20=32) 位元組。: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 可直接燒錄。