【发布时间】:2018-02-01 14:00:24
【问题描述】:
我在我的 IDE 中定义了一个 AES-128 密钥作为构建符号,因此它像这样调用 GCC:
arm-none-eabi-gcc -D"AES_KEY=3B7116E69E222295163FF1CAA1681FAC" ...
(相当于#define AES_KEY 3B7116E69E222295163FF1CAA1681FAC)
优点是相同的符号也可以作为参数自动传递给构建后 CLI 脚本,该脚本使用此密钥加密编译的代码(例如,用于安全固件更新)...
但是如何将此键作为字节数组存储在 我的代码? 我想定义一个进行转换的预处理器宏:
uint8_t aes_key[] = { SPLIT_MACRO(AES_KEY) };
到
uint8_t aes_key[] = {0x3B, 0x71, 0x16, 0xE6, 0x9E, 0x22, 0x22, 0x95, ...};
换句话说,GCC 预处理器能否将密钥字符串拆分为 2 个字符块并在它们之间添加“, 0x”?
【问题讨论】:
-
没有。您应该生成源。预处理器可以连接标记但不能拆分它们,而且它完全是有限的。
-
顺便说一句:你的意思是
uint8_t aes_key[] = {0x3B, Ox71, 0x16, 0xE6, 0x9E, 0x22, 0x22, 0x95, ...}(注意[]),对吧? -
使用任何其他工具(甚至是 C 中的另一个程序)创建一个 .h 文件,然后编译。全部在makefile中
-
另外,您可以将字符串拆分为整数大小的块,或者您可以简单地将字符串用作字符串并在运行时对其进行解析,将各个字节保存到数组中。除非您有成千上万个这样的字符串,否则在运行时花费的几个额外周期应该不会引起注意。
-
或者只是一个函数,为什么不在一个函数中初始化数组呢?您不需要动态分配它。
标签: c gcc macros c-preprocessor preprocessor