【问题标题】:How can I replicate compile time hex string interpretation at run time!? c++如何在运行时复制编译时十六进制字符串解释!? C++
【发布时间】:2021-11-27 06:26:14
【问题描述】:

在我的代码中,以下行为我提供了执行任务的数据:

const char *key = "\xf1`\xf8\a\\\x9cT\x82z\x18\x5\xb9\xbc\x80\xca\x15";

问题是它在编译时根据我不完全理解的规则进行转换。 How does "\x" work in a String?

我想做的是得到相同的结果,但从一个与运行时输入的字符串完全相同的字符串中得到。我已经尝试了很多东西并寻找答案,但没有一个足够匹配我能够申请。

我知道 \x 表示一个十六进制数字。但我不知道编译器 (gcc) 以哪种形式“烘焙”出来。

那个`翻译成什么?

“\a”是否与“\x”类似?

【问题讨论】:

  • 该反引号没有“翻译”。为什么应该有?如果你读过任何体面的书,你就会知道'\a' 是“警报”或“响铃”的转义码。
  • 至于编译器如何识别和翻译这些转义序列,它必须从文件中读取源代码到内存中。虽然它会识别转义反斜杠,然后检查下一个字符。如果它是x,那么它知道后面有一个十六进制数字,它会读取并转换它,就像你自己做的那样。 strtolstd::stoi.

标签: c++ arrays hex


【解决方案1】:

这确实是编译器提供的,但这部分不是标准库的成员。这意味着您有 3 种方式:

  • 动态写入包含该字符串的 C++ 源文件,并将其写入其标准输出。编译它并(如果popen 可用)从你的主程序执行它并读取它的输入。很丑是不是...
  • 使用现有编译器的源代码,或直接使用其内部库。 Clang 可能是一个很好的起点,因为它被设计成模块化的。但可能需要大量工作才能找到该死的特定点的编码位置以及如何使用它......
  • 只需模仿编译器所做的事情,然后手动编写您自己的解析器。这并不难,并且会告诉你为什么测试是有用的......

如果到这里还不清楚,我强烈建议您使用第三种方式;-)

【讨论】:

  • 因为结果是一个 char 字符串,我想我对编译器对十六进制的作用感到困惑/好奇,因为它可能是“5C 78 66 31”或“5C786631”或“ 92 120 102 49"。但只有测试会告诉我们。我也对 hex 和 ` 和 \a 的混合感到困惑。我觉得这是一个非常糟糕的设计,让编译器在我显式传递字符串时不透明地具有这种行为。
【解决方案2】:

如果您想在运行时作为输入的字符串中转换“转义”代码,那么您需要自己明确地进行。

一种方法是将输入读入一个字符串。然后将源字符串中的字符一一复制到新的目标字符串中。如果您看到反斜杠,则丢弃它,获取下一个字符,如果是x,您可以使用例如std::stoi 将接下来的几个字符转换为其对应的整数值,并将该数字附加到目标字符串(使用std::to_string 添加它,或者使用输出字符串流和普通的“输出”运算符<<)。

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 1970-01-01
    • 2020-11-11
    • 2019-08-03
    • 2020-01-09
    • 2018-01-31
    • 1970-01-01
    • 2019-07-27
    • 2018-08-21
    相关资源
    最近更新 更多