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

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

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

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

也许像

static const __attribute__((rawDataFromFile("myDataFile.bin"))) uint8_t s_data[];

代替经典的外部方式
   bin2hex myDataFile.bin myDataFile.hex

static const uint8_t s_data[] = {
  #include "myDataFile.hex"
};

首选在CC++中工作的解决方案,但也欢迎只在两者之一中工作的建议。

yukiww 回答:将二进制数据文件包含到已编译的二进制文件中,而不转换为十六进制数组

大约20年前,我在Turbo Pascal上使用了一个古老的技巧,即将二进制文件转换为对象文件。 Here it is with C++

  1. 数据文件data.dat

    ABC
    
  2. 转换为目标文件:

    ld -r -b binary data.dat -o data.o
    

    here所述,通过-b binary <name>选项,目标文件将包含<name>部分中文件.data的原始二进制数据和三个符号{{1} },_binary_<name>_start_binary_<name>_end

  3. 简单程序:

    _binary_<name>_size
  4. 编译和链接:

    #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 << ' ';
    }
    
  5. 输出:

    g++ -c test.cpp
    g++ test.o data.o
    

编辑1

  

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

不幸的是,这是事实。您可能要看一下this library,它使用内联汇编程序嵌入二进制数据。

编辑2 找到了可能的duplicate question

,

使用ld

ld -r -b binary binaryfile -o objectfile 
objcopy --rename-section .data=.yoursection objectfile
本文链接:https://www.f2er.com/3118519.html

大家都在问