2017-10-03 28 views
-2

J'ai une chaîne que j'ai obscurcie dans mon code, en XORing chaque caractère par une valeur aléatoire. Toutefois, le littéral de chaîne brute multi-lignes résultant ne compilera pas correctement.C++: Une chaîne XOR'd avec des caractères spéciaux ne sera pas compilée en tant que chaîne littérale brute?

Dans l'image suivante, vous pouvez voir comment MSVS2015 n'analyse pas la chaîne correctement, même en utilisant des délimiteurs appropriés à chaque extrémité (notez le texte en noir, sans être analysé en tant que partie de la chaîne). Essayer de compiler le code entraîne des erreurs sur le fait de ne pas pouvoir trouver l'accolade fermante du littéral (même si c'est à la bonne place, à la toute fin de la chaîne après le délimiteur de fermeture, etc.). L'effacement manuel des bits noirs entraîne une compilation correcte (bien qu'avec une chaîne qui ne peut plus être correctement désembrouillée, bien sûr).

enter image description here

Je suppose que ce qui se passe parce que différents personnages résultant de la fonction XOR ne peut pas être correctement enregistrées dans le fichier .h. Y at-il une solution à ce problème? J'ai essayé de passer le format de fichier à Unicode mais cela n'a pas fonctionné.

+1

Veuillez ne pas afficher l'écran d'impression du code. – bolov

+3

Peut-être que vous devriez envisager une autre façon d'encoder votre chaîne? Peut-être une sorte de schéma d'encodage hexadécimal ou quelque chose qui aboutit à des caractères ASCII simples? Et bien sûr, assurez-vous que le littéral de chaîne n'est pas [à long] (https://msdn.microsoft.com/en-us/library/sx08afx2.aspx). –

+0

@ user23573 Il utilise des chaînes brutes. échapper des caractères n'est pas un problème – bolov

Répondre

0

Votre utilisation de chaînes brutes est trop simpliste. Il prend la séquence ..|.. comme délimiteur, vous n'avez probablement pas la séquence )..|.. à la fin de votre chaîne.

Utilisez la spécification complète des chaînes brutes délimitées comme décrit in cppreference dans la variante (6). Ceci est également décrit dans la section standard C++ §2.14.5 Littéraux de chaîne. Le modèle est le suivant:

R » d-char séquence (votre texte brut) d-char séquence "

La clé est d'utiliser la " d-char-sequence ". Cette séquence peut contenir les éléments suivants:

tout membre du caractère de source de base fixé à l'exception: l'espace , la parenthèse gauche (la parenthèse droite), la barre oblique inverse \, et les caractères de contrôle représentant onglet horizontal, onglet vertical, flux de formulaire et retour à la ligne.

Comment que d-char-séquence fonctionne est décrite comme suit:

Une chaîne de caractères qui a un R dans le préfixe est une chaîne littérale brut. La séquence d-char sert de délimiteur. La séquence de terminaison d-char d'une chaîne brute est la même séquence de caractères que la séquence initiale d-char. Une séquence d-char doit comporter au maximum 16 caractères.

Cela garantit que la chaîne brute peut contenir légalement n'importe quel caractère pris en charge par le jeu de caractères source (unicode ici). La chaîne brute peut contenir des guillemets entre parenthèses et même des retours à la ligne.

Ce n'est pas aussi compliqué que ça en a l'air.Ajoutez simplement un préfixe et un suffixe à la chaîne brute. Il pourrait ressembler à ceci:

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

Bien sûr substitut ... long text ... avec la chaîne brute littérale. Assurez-vous simplement que la séquence )my-delimiter" n'apparaît pas dans le texte brut de la chaîne.

+0

Cela n'explique pas pourquoi "l'effacement manuel des bits noirs entraîne une compilation correcte", selon la question. Si le délimiteur est manquant à la fin, la suppression d'une chaîne au milieu ne le résoudra pas. – MSalters

+0

J'ai un délimiteur approprié à la fin, comme indiqué dans la question initiale. – Tyson