c/c++语言开发共享预处理器宏将hex字符串转换为字节数组

我在我的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-char块中拆分密钥字符串并在它们之间添加“ , 0x ”?

    有点笨拙,但如果您提前知道密钥的长度,您可以按如下方式处理:

    如果你的KEY不是字符串的forms,即用双引号括起来,那么使用stringify-operator # (使用可变参数宏的技巧,以便在用作参数时扩展宏或另一个宏):

     // 01234567890123456789012345678901 #define K 3B7116E69E222295163FF1CAA1681FAC #define STRINGIFY_HELPER(A) #A #define STRINGIFY(...) STRINGIFY_HELPER(__VA_ARGS__) #define KEY STRINGIFY(K) #define HEXTONIBBLE(c) (*(c) >= 'A' ? (*(c) - 'A')+10 : (*(c)-'0')) #define HEXTOBYTE(c) (HEXTONIBBLE(c)*16 + HEXTONIBBLE(c+1)) uint8_t aes_key[] = { HEXTOBYTE(KEY+0), HEXTOBYTE(KEY+2), HEXTOBYTE(KEY+4), HEXTOBYTE(KEY+6), HEXTOBYTE(KEY+8), HEXTOBYTE(KEY+10), HEXTOBYTE(KEY+12), HEXTOBYTE(KEY+14), HEXTOBYTE(KEY+16), HEXTOBYTE(KEY+18), HEXTOBYTE(KEY+20), HEXTOBYTE(KEY+22), HEXTOBYTE(KEY+24), HEXTOBYTE(KEY+26), HEXTOBYTE(KEY+28), HEXTOBYTE(KEY+30) }; int main() { for (int i=0; i 

    输出:

     3B 71 16 E6 9E 22 22 95 16 3F F1 CA A1 68 1F AC 

    这不能回答原始问题,但是如果密钥可以用这种格式写成:

     #define AES_KEY 3B,71,16,E6,9E,22,22,95,16,3F,F1,CA,A1,68,1F,AC 

    即使在GCC下,以下宏也可以工作:

     #define BA(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) {0x##a,0x##b,0x##c,0x##d, 0x##e,0x##f,0x##g,0x##h,0x##i,0x##j,0x##k,0x##l,0x##m,0x##n,0x##o,0x##p} #define TO_BYTEARRAY(...) BA(__VA_ARGS__) uint8_t aes_key[] = TO_BYTEARRAY(AES_KEY); 

    参见Concatenation , Argument Prescan和Variadic Macros

      以上就是c/c++开发分享预处理器宏将hex字符串转换为字节数组相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/541691.html

      (0)
      上一篇 2021年1月3日
      下一篇 2021年1月3日

      精彩推荐