如何在 运行 时间复制编译时十六进制字符串解释!? C++
How can I replicate compile time hex string interpretation at run time!? c++
在我的代码中,以下行为我提供了执行任务的数据:
const char *key = "\xf1`\xf8\a\\x9cT\x82z\x18\x5\xb9\xbc\x80\xca\x15";
问题是它在编译时根据我不完全理解的规则进行了转换。 How does "\x" work in a String?
我想要做的是获得相同的结果,但来自与 运行 时间输入的字符串完全相同的字符串。我已经尝试了很多东西并寻找答案,但 none 非常匹配,足以让我能够申请。
我知道 \x 表示十六进制数。但是我不知道编译器(gcc)以哪种形式获得'baked out'。
那个 ` 翻译成什么?
“\a”是否与“\x”类似?
如果您想翻译在 运行 时作为输入获得的字符串中的“转义”代码,那么您需要自己明确地完成。
一种方法是将输入读入一个字符串。然后将源字符串中的字符一个一个地复制到新的目标字符串中。如果你看到一个反斜杠然后你丢弃它,获取下一个字符,如果它是一个 x
你可以使用例如std::stoi
将接下来的几个字符转换成相应的整数值,并将该数字附加到目标字符串(使用 std::to_string
添加它,或使用输出字符串流和正常的“输出”运算符 <<
).
这确实是编译器提供的,但这部分不是标准库的成员。这意味着你有 3 种方式:
- 动态编写包含字符串的 C++ 源文件,并将其写入标准输出。编译它并(提供
popen
可用)从您的主程序执行它并读取它的输入。是不是很丑...
- 使用现有编译器的源代码,或直接使用其内部库。 Clang 可能是一个很好的起点,因为它被设计成模块化的。但是可能需要大量的工作才能找到该死的特定点的编码位置以及如何使用它...
- 只需模仿 编译器所做的,然后手动编写您自己的解析器。这并不难,并且会让您了解为什么测试有用...
如果到这里还不清楚,我强烈建议你使用第三种方式;-)
在我的代码中,以下行为我提供了执行任务的数据:
const char *key = "\xf1`\xf8\a\\x9cT\x82z\x18\x5\xb9\xbc\x80\xca\x15";
问题是它在编译时根据我不完全理解的规则进行了转换。 How does "\x" work in a String?
我想要做的是获得相同的结果,但来自与 运行 时间输入的字符串完全相同的字符串。我已经尝试了很多东西并寻找答案,但 none 非常匹配,足以让我能够申请。
我知道 \x 表示十六进制数。但是我不知道编译器(gcc)以哪种形式获得'baked out'。
那个 ` 翻译成什么?
“\a”是否与“\x”类似?
如果您想翻译在 运行 时作为输入获得的字符串中的“转义”代码,那么您需要自己明确地完成。
一种方法是将输入读入一个字符串。然后将源字符串中的字符一个一个地复制到新的目标字符串中。如果你看到一个反斜杠然后你丢弃它,获取下一个字符,如果它是一个 x
你可以使用例如std::stoi
将接下来的几个字符转换成相应的整数值,并将该数字附加到目标字符串(使用 std::to_string
添加它,或使用输出字符串流和正常的“输出”运算符 <<
).
这确实是编译器提供的,但这部分不是标准库的成员。这意味着你有 3 种方式:
- 动态编写包含字符串的 C++ 源文件,并将其写入标准输出。编译它并(提供
popen
可用)从您的主程序执行它并读取它的输入。是不是很丑... - 使用现有编译器的源代码,或直接使用其内部库。 Clang 可能是一个很好的起点,因为它被设计成模块化的。但是可能需要大量的工作才能找到该死的特定点的编码位置以及如何使用它...
- 只需模仿 编译器所做的,然后手动编写您自己的解析器。这并不难,并且会让您了解为什么测试有用...
如果到这里还不清楚,我强烈建议你使用第三种方式;-)