我通常希望将来自外部文件的二进制数据作为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++,但也欢迎仅在两者之一中起作用的建议。
我想到了20年前我在Turbo Pascal上使用的一个古老技巧,即将二进制文件转换为对象。这就是C ++:
资料档案data.dat:
ABC
Run Code Online (Sandbox Code Playgroud)转换为目标文件:
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将被创建。
简单程序:
#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)编译和链接:
g++ -c test.cpp
g++ test.o data.o
Run Code Online (Sandbox Code Playgroud)输出:
A B C
Run Code Online (Sandbox Code Playgroud)编辑1
这也引入了数据的外部预处理,甚至引入了需要知道如何命名符号的需求
不幸的是,这是事实。您可能想看看这个库,它使用内联汇编程序嵌入二进制数据。
编辑2 找到一个可能重复的问题。