【问题标题】:c++: XOR'd string with special characters won't compile as raw string literal?c ++:具有特殊字符的异或字符串不会编译为原始字符串文字?
【发布时间】:2018-03-14 09:59:35
【问题描述】:

我有一个字符串,我在我的代码中通过某个随机值对每个字符进行异或运算来混淆处理。

但是,生成的多行原始字符串文字将无法正确编译。

在下图中,您可以看到 MSVS2015 没有正确解析字符串,即使在两端使用了适当的分隔符(注意整个黑色文本,没有被解析为字符串的一部分)。

尝试编译代码会导致无法找到文字的右大括号的错误(即使它位于正确的位置,在右分隔符之后的字符串末尾等)。手动擦除黑色位会导致正确编译(当然,字符串不能再正确解读)。

我假设这是因为 XOR 函数的各种结果字符无法正确保存在 .h 文件中。这个问题有解决方案吗?我尝试将文件格式切换为 Unicode,但没有奏效。

【问题讨论】:

  • 请不要显示代码的打印屏幕。
  • 也许你应该考虑一些其他的方式来编码你的字符串?也许某种十六进制编码方案或某种导致纯 ASCII 字符的东西?当然要确保字符串文字不是to long
  • @user23573 他正在使用原始字符串。转义字符不是问题
  • 源代码只能包含来自实现定义的源字符集的字符。这意味着编译器文档必须在某个地方指定您可以使用哪些字符。
  • @MSalters 也是实现定义了文件中的实际字符如何映射到源字符集(例如 UTF-8、带有 BOM 的 UTF-16 等);也许 OP 设法创建了一个不符合该要求的文件

标签: c++ string unicode xor literals


【解决方案1】:

您对原始字符串的使用过于简单。它将序列..|.. 作为分隔符,您的字符串末尾可能没有序列)..|..

使用完整的分隔原始字符串规范,如变体 (6) 中所述的 in cppreference。这也在 C++ 标准部分 §2.14.5 字符串文字中进行了描述。模板如下:

R"d-char-sequence(你的原始文本)d-char-sequence"

关键是使用“d-char-sequence”。该序列可以包含以下内容:

基本源字符集的任何成员,除了: 空格,左括号(,右括号),反斜杠\, 和代表水平制表符的控制字符, 垂直制表符、换页和换行符。

d-char-sequence 的工作原理描述如下:

前缀中带有 R 的字符串文字是原始字符串文字。 d-char-sequence 用作分隔符。原始字符串的终止 d-char-sequence 是与初始 d-char-sequence 相同的字符序列。一个 d-char-sequence 最多包含 16 个字符。

这确保原始字符串可以合法地包含源字符集(此处为 unicode)支持的任何字符。原始字符串可能包含引号、括号、反斜杠甚至换行符。

这并不像听起来那么复杂。只需在原始字符串中添加前缀和后缀即可。它可能看起来像这样:

std::string(R"my-delimiter(... long text ...)my-delimiter");

当然用原始字符串文字替换... long text ...。只需确保序列)my-delimiter" 不会出现在原始字符串文本中。

【讨论】:

  • 这并不能解释为什么“手动擦除黑色位会导致正确编译”,根据问题。如果末尾缺少分隔符,则删除中间的字符串不会修复它。
  • 我在最后有一个适当的分隔符,如原始问题中所述。
猜你喜欢
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 2011-04-11
  • 2012-09-07
  • 1970-01-01
  • 2022-11-25
相关资源
最近更新 更多