用于将十六进制字符串转换为字节数组的预处理器宏

2024-03-07

我已将 AES-128 密钥定义为 IDE 中的构建符号,以便它像这样调用 GCC:

arm-none-eabi-gcc -D"AES_KEY=3B7116E69E222295163FF1CAA1681FAC" ...

(这相当于#define AES_KEY 3B7116E69E222295163FF1CAA1681FAC)

优点是相同的符号也可以作为参数自动传递给构建后的 CLI 脚本,该脚本使用此密钥对编译后的代码进行加密(例如,用于安全的固件更新)...

但是如何将此密钥存储为字节数组 我的代码? 我想定义一个进行转换的预处理器宏:

uint8_t aes_key[] = { SPLIT_MACRO(AES_KEY) };

to

uint8_t aes_key[] = {0x3B, 0x71, 0x16, 0xE6, 0x9E, 0x22, 0x22, 0x95, ...};

换句话说,GCC 预处理器是否可以将密钥字符串拆分为 2 个字符的块并添加“, 0x“ 它们之间?


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

  1. 定义一个宏HEXTONIBBLE将十六进制数字转换为数字
  2. 定义一个宏HEXTOBYTE使用HEXTONIBBLE从十六进制获取一个字节
  3. 初始化你的数组HEXTOBYTE正确参数化

If your KEY不是字符串形式,即用双引号括起来,然后使用 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<sizeof(aes_key); i++) {
        printf("%02X ", aes_key[i]);
    }

    return 0;
}

Output:

3B 71 16 E6 9E 22 22 95 16 3F F1 CA A1 68 1F AC 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于将十六进制字符串转换为字节数组的预处理器宏 的相关文章

  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • C free() 是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 malloc 和 free 如何工作 https stackoverflow com questions 1119134 how malloc and free work include
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • 为什么不能调用带有 auto& 参数的 const mutable lambda?

    include
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • 双打会遭受溢出吗?

    双精度浮点数或浮点数是否可能发生溢出 环绕 如果在 x86 或 x64 硬件上达到最大值 或最小值 会发生什么情况 在符合 IEEE 754 标准的系统上 溢出会导致特殊的 无穷大 或 负无穷大 值 超过该值 任何进一步的增量都将不起作用
  • 词汇分散图是seaborn

    我正在使用 seaborn 模块来生成类似于下面示例的图 import pandas as pd import matplotlib pyplot as plt import numpy as np import seaborn as sn
  • 如何将特定文件类型从一个文件夹复制到另一个文件夹

    如何将特定文件类型从一个文件夹复制到另一个文件夹 同时保留文件夹结构 以下批处理命令能够将特定文件类型复制到文件夹 但无法保留文件夹结构 for R c source f in cpp h do copy f x destination 我
  • 每个 Java 应用程序是否有一个 JVM?

    所有运行的 Java 应用程序都使用相同的 JVM 还是 每个 Java 应用程序一个 JVM 适用 假设应用程序是 IntelliJ IDEA 服务器和 NetBeans 此外 每个Java应用程序分配的JVM和使用的进程之间是否有任何联
  • AS3 - 缩放位图数据

    我想将 BitmapData 缩放到不同的大小 例如 200 400 600 和 800 有什么好的方法可以做到这一点 你不能直接缩放BitmapData但你可以对其进行缩放克隆 这是一个缩放的简单示例BitmapData package
  • 在 pkg-config 搜索路径中找不到 OpenCV 包

    我已经按照中的说明安装了 OpenCVhttps help ubuntu com community OpenCV https help ubuntu com community OpenCV sudo su sudo apt get in
  • 检索当前正在运行的应用程序的导航历史记录

    我想要一种方法来向用户显示他当前在应用程序中的位置 例如 如果我有activity A activity B activity C等等 如果他导航到activity E 例如 他应该能够看到他如何登陆当前屏幕的历史记录 从Home gt E
  • ASP.Net MVC 4 捆绑包

    我见过的很多代码都引用了这个 section Scripts Scripts Render bundles jqueryval 这很棒 而且它可以工作 如果包含 某些东西 我是否必须添加参考才能获取这些 使用 NuGet 复制 DLL 这是
  • C++ 全局初始化可以有多懒?

    我习惯于认为全局 静态类成员的所有初始化都发生在 main 的第一行之前 但我最近在某处读到该标准允许稍后进行初始化以 协助模块的动态加载 在动态链接时我可以看到这是真的 我不希望在 dlopen 库之前初始化库中初始化的全局变量 然而 在
  • 有没有办法在 return 语句之后做更多的工作?

    我有点好奇返回结果后是否可以在函数中做更多的工作 基本上 我正在使用金字塔框架 只是用 python 编码 创建一个网站 在处理输入后 我返回变量来渲染页面 但有时我想在渲染页面后做更多工作 例如 您访问我的网站并更新您的个人资料 您所关心
  • BigQuery 数据集通配符?

    我用过tableBigQuery 中的通配符功能 但是否可以使用通配符跨多个查询datasets在一个项目内 不 目前这是不可能的 技术原因之一是 如果表通配符跨越数据集 查找涉及的表会更加困难
  • html文本框形式不允许输入

    html 表单中是否有任何类不允许您在该文本框中输入或更改值 但你可以看到它的内容 例如下面的代码将允许你看到mysql数据库中记录的内容 但我想要的是它不被编辑 我将在下面的代码中添加什么 以便用户不会编辑其内容 tr td font s
  • 使用 ListAdapter 填充 ScrollView 布局内的 LinearLayout

    我面临一个非常常见的问题 我布置了一个活动 现在发现它应该显示其中的一些项目ScrollView 通常的方法是使用现有的ListAdapter 将其连接到ListView and BOOM我会有我的物品清单 BUT你不应该放置一个嵌套的Li
  • 如何在 Eclipse 中指定预处理器指令?

    Eclipse 中如何为不同的配置指定预处理器指令 例如 如果我有多个电源 应该以不同的配置运行并指定 ifdef Problem1 main func endif Problem1 请注意 这是托管 makefile 的情况 The 文档
  • 同位素 v2 网格 - 多个过滤器 - 隐藏空过滤器

    我当前的同位素网格有两个下拉过滤器 用于对网格项目进行排序 第一个过滤器是菜单类型 第二个过滤器是饮料类型 然而 每种菜单类型并不包含所有饮料类型 因此当选择某些过滤器配置时 不会显示任何结果 这是正确的 但我想通过当用户选择第一个过滤器时
  • jquery 不从 javascript 函数调用 Web 方法

    长期从事 WinForm 程序员 但对 Web 编程领域还是个新手 我有 Visual Studio 2010 并且创建了一个新的网站项目 我似乎无法让 ajax 调用我创建的 webmethod 当我单击页面上的按钮时 什么也没有发生 当
  • 使用 Anaconda 设置 Hydrogen 和 Atom 管理 python 安装

    我已将我的 python 3 可执行文件添加到系统路径 违背 Anaconda 的建议 以尝试让 Hydrogen 以及实际上任何 Atom 扩展 插件 在 Atom 中运行代码行或代码块 脚本 原子插件似乎可以工作 我选择一些代码并输入c
  • npm 错误!致命:无法找到“https”的远程帮助程序

    我在跑npm install在远程会话的 React Native 项目中 更具体地说 这npm install是我运行的构建脚本的一部分VSTS代理 https github com microsoft vsts agent 我遇到了这个
  • 在mockito中模拟通用scala方法

    我正在开发一个 Scala 项目 使用 Mockito 作为模拟框架 我想模拟以下通用 Scala 方法 def parseXml T ClassTag xmlUrl URL xsdUrl Option URL Option T 当嘲笑时
  • 用于将十六进制字符串转换为字节数组的预处理器宏

    我已将 AES 128 密钥定义为 IDE 中的构建符号 以便它像这样调用 GCC arm none eabi gcc D AES KEY 3B7116E69E222295163FF1CAA1681FAC 这相当于 define AES K