c ++:带有特殊字符的XOR'd字符串不会编译为原始字符串文字?

时间:2017-10-03 08:48:50

标签: c++ string unicode xor literals

我在代码中混淆了一个字符串,通过对每个字符进行一些随机值进行异或。

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

在下图中,您可以看到MSVS2015如何正确解析字符串,即使在任何一端使用正确的分隔符(注意整个黑色文本,而不是作为字符串的一部分进行解析)。

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

enter image description here

我假设发生了这种情况,因为XOR函数的各种结果字符无法正确保存在.h文件中。有这个问题的解决方案吗?我已经尝试将文件格式切换为Unicode,但这不起作用。

1 个答案:

答案 0 :(得分:0)

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

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

  

R“ d-char-sequence 您的原始文本 d-char-sequence

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

  

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

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

  

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

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

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

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

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