我在代码中混淆了一个字符串,通过对每个字符进行一些随机值进行异或。
但是,生成的多行原始字符串文字将无法正确编译。
在下图中,您可以看到MSVS2015如何正确解析字符串,即使在任何一端使用正确的分隔符(注意整个黑色文本,而不是作为字符串的一部分进行解析)。
尝试编译代码导致无法找到文字的右括号的错误(即使它在正确的位置,在结束分隔符之后的字符串的最末端等)。手动擦除黑色位会导致正确的编译(当然,虽然字符串不能正确解密)。
我假设发生了这种情况,因为XOR函数的各种结果字符无法正确保存在.h文件中。有这个问题的解决方案吗?我已经尝试将文件格式切换为Unicode,但这不起作用。
答案 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"
没有出现在原始字符串文本中。