【ARM 嵌入式 C 文件操作系列 20.3 -- 二进制文件转为16进制数组】


请阅读【嵌入式开发学习必备专栏】


binary to hex

在嵌入式开发的过程中经常遇到需要将二进制文件转换为十六进制数组的需求,比如需要将某个镜像文件转换为数组,然后通过写memory的方式将镜像文件加载到内存中。下面代码给出了如何使用C 代码将一个二进制文件转为十六进制数据。

C code

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>

int main(int argc, char *argv[])
{
    FILE *fpIn, *fpOut;
    uint32_t buffer[1];
    uint64_t i = 0x200000000ULL;
    size_t bytesRead;

    if (argc < 2) {
        printf("Usage: %s offset\n", argv[0]);
        return 1;
    }

    const char *file_name  = argv[1];
    /* uint64_t base = atoi(argv[2]); */

    fpIn = fopen(file_name, "rb");
    if (fpIn == NULL) {
        perror("Error opening file");
        return EXIT_FAILURE;
    }

    fpOut = fopen("test_data.h", "w");
    if (fpOut == NULL) {
        perror("Error opening file");
        fclose(fpIn);
        return EXIT_FAILURE;
    }

    fprintf(fpOut, "#ifndef __TEST_DATA_H__\n");
    fprintf(fpOut, "#define __TEST_DATA_H__\n\n");
    fprintf(fpOut, "struct test_str test_data[] = {\n");

    while ((bytesRead = fread(buffer, sizeof(buffer[0]), 1, fpIn)) == 1) {
        fprintf(fpOut, "{0x%" PRIx64 ",", i);
        fprintf(fpOut, "0x%08X,},\n", buffer[0]);
        i += sizeof(buffer[0]);
    }

    fprintf(fpOut, "};\n\n");
    fprintf(fpOut, "#endif // __TEST_DATA_H__\n");

    fclose(fpIn);
    fclose(fpOut);
    return EXIT_SUCCESS;
}

这段代码首先尝试以二进制读取模式打开文件,然后以写模式打开test_data.h文件。通过fread函数以4字节为一个单位循环读取数据,每次读取成功后,将读取到的数据以指定格式写入到test_data.h文件中。

测试效果

#ifndef __TEST_DATA_H__
#define __TEST_DATA_H__

struct test_str test_data[] = {
{0x200000000,0x02033000,},
{0x200000004,0x00801F85,},
{0x200000008,0x00802041,},
{0x20000000c,0x00802041,},
{0x200000010,0x00802041,},
{0x200000014,0x00802041,},
{0x200000018,0x00802041,},
{0x20000001c,0x00000000,},
{0x200000020,0x00000000,},
{0x200000024,0x00000000,},
{0x200000028,0x00000000,},
...

第一列为地址,第二例为数据。

Makefile 编译

# 定义编译器
CC = gcc

# 定义编译选项
CFLAGS = -Wall

# 定义源文件
SOURCES = bin2hex.c #d.c

# 定义目标文件
OBJECTS = $(SOURCES:.c=.o)

# 定义可执行文件
EXECUTABLE = bin2hex

# 默认目标
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
	$(CC) $(CFLAGS) $(OBJECTS) -o $@

# 通用规则用于从每个.c文件构建.o文件
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

#$(shell awk -F, 'NR >= 0 && $2 != "0x00000000" {print}' test_data.h > demo_firmware.h)

# 清理编译产物的目标
clean:
	rm -f $(OBJECTS) $(EXECUTABLE)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

主公讲 ARM

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

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

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

打赏作者

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

抵扣说明:

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

余额充值