将二进制数据文件包含到已编译的二进制文件中,而无需转换为十六进制数组

vla*_*sch 2 c c++ gcc

我通常希望将来自外部文件的二进制数据作为uint8_t数组包含(编译)到我的程序(嵌入式或裸机)中。

有没有办法将它们转换成十六进制数组?因为这涉及额外的构建步骤,这些步骤有时不那么容易集成,例如在Arduino工具链的情况下。并且手动执行此操作始终会导致忘记十六进制更新:-)

通常我正在使用gcc。因此,如果它是特定于gcc的编译指示或其他扩展,我也将很高兴(尽管不如通用解决方案那样满意)。

也许像

static const __attribute__((rawDataFromFile("myDataFile.bin"))) uint8_t s_data[];
Run Code Online (Sandbox Code Playgroud)

而不是传统的外部
bin2hex myDataFile.bin myDataFile.hex

static const uint8_t s_data[] = {
  #include "myDataFile.hex"
};
Run Code Online (Sandbox Code Playgroud)

首选采用in in C和in的解决方案C++,但也欢迎仅在两者之一中起作用的建议。

Evg*_*Evg 5

我想到了20年前我在Turbo Pascal上使用的一个古老技巧,即将二进制文件转换为对象。这就是C ++

  1. 资料档案data.dat

    ABC
    
    Run Code Online (Sandbox Code Playgroud)
  2. 转换为目标文件:

    ld -r -b binary data.dat -o data.o
    
    Run Code Online (Sandbox Code Playgroud)

    正如解释在这里,与-b binary <name>选择目标文件将包含原始二进制数据从文件<name>中的.data部分,和三个符号_binary_<name>_start_binary_<name>_end以及_binary_<name>_size将被创建。

  3. 简单程序:

    #include <cstdint>
    #include <iostream>
    
    extern const std::uint8_t _binary_data_dat_start[];
    extern const std::uint8_t _binary_data_dat_end[];
    
    int main()
    {
        for (auto d = _binary_data_dat_start; d != _binary_data_dat_end; ++d)
            std::cout << (char)*d << ' ';
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 编译和链接:

    g++ -c test.cpp
    g++ test.o data.o
    
    Run Code Online (Sandbox Code Playgroud)
  5. 输出:

    A B C
    
    Run Code Online (Sandbox Code Playgroud)

编辑1

这也引入了数据的外部预处理,甚至引入了需要知道如何命名符号的需求

不幸的是,这是事实。您可能想看看这个库,它使用内联汇编程序嵌入二进制数据。

编辑2 找到一个可能重复的问题