2016-04-18 14 views
-2

Ich versuche, eine kleine Zeichenfolge zu xorieren, es funktioniert. Wenn ich versuche, die XORed-Zeichenfolge zu verwenden, kann ich sie nicht einmal kompilieren.XOR falsches Ergebnis, escape char

string str = "MyNameIsMila"; 
string str_xored = "2*&.8"'*"; //you can't escape this or the result be be different 
//Enc:2*&.8"'*: 
//Dec:MyNameIsMila: 

Ich habe versucht, die Zeichenfolge zu entkommen, aber dann habe ich ein anderes Ergebnis am Ende. Irgendeine gute Richtung dafür? Output nach der Flucht:

//Enc:yamesila: 
//Dec:2*&.8"'*: 

Hoffte MyNameIsMila zurück zu bekommen.

Die Funktion sieht so aus:

string encryptDecrypt(string toEncrypt) { 
    char key = 'K'; //Any char will work 
    string output = toEncrypt; 
    for (int i = 0; i < toEncrypt.size(); i++) 
     output[i] = toEncrypt[i]^key; 
    return output; 
} 
+1

Sie Probleme bekommen, denn das ist kein * string *. '" 2 * &. 8 \ "'*" 'ist eine Zeichenkette. –

+1

Zuletzt habe ich überprüft, Zeichenketten gehen in Anführungsstriche. Das Problem ist, dass Ihre XORd Schnur nicht alle druckbar ist. –

+0

@JoachimPileborg die Schnur entziehend erhält falsche Ergebnisse – user5650719

Antwort

0

I 2 Dinge haben zu sagen:

1: The value of a string needs to be between 2 -> ""

string str_xored = 2*&.8"'*; //this is not a valid syntax = error 

//valid 
string str_xored = "2*&.8"; 
str += '"'; 
str += "'*"; 

2: In your case I would use iterators:

#include <iostream> 
#include <string> 

//please don't use "using namespace std;" 

std::string encryptDecrypt(std::string toEncrypt) { 
    char key = 'K';   //Any char will work 
    std::string output = ""; //needs to be empty 

    for (auto i = toEncrypt.begin(); i != toEncrypt.end(); i++) { 
     output += *i^key;  //*i holds the current character to see how 
           //an iterator works have a look at my link 
    } 
    return output; 
} 


int main() { 

    std::string str = encryptDecrypt("Hello...!"); 

    std::cout << str << std::endl; 

    return 0; 
} 

haben hier einen Blick auf die (string) Iterator :

Link 1

Link 2

Wenn Sie denken, Iteratoren zu schwierig sind, dann nutzen Sie Ihre

for(int i = 0; i < str.size(); i++){ 
    //CODE 
} 

for() - Schleife

+0

Mehr hilfreich die anderen Kommentare. Ich weiß, dass eine Variable zwischen zwei sein muss ".. Ich kann ' t verwende deine gültige Zeichenfolge, um Fehler zu erhalten r: Ungültige Operanden zu binärem Ausdruck ('const char *' und 'const char *') string str = "2 * &. 8" + '"' + '' *"; . – user5650719

+0

Bearbeitet, sollte es jetzt funktionieren.Ich probierte mich selbst – tistCoder

0

Sie können nicht XOR-verknüpft Strings wie normale Strings behandeln!

value^same_value == 0 

Behandeln Sie sie stattdessen als normale Behälter.

Beispiel:

#include <iostream> 
#include <iterator> 
#include <algorithm> 

template<typename InputIterator, typename OutputIterator, typename Key> 
void perform_xor(InputIterator begin, InputIterator end, OutputIterator out, Key const &key) { 
    std::transform(begin, end, out, [key](auto &&value) { 
     return value^key; 
    }); 
} 

using namespace std; 

int main() { 
    char test[] = "(2*&.8\"\'*"; 

    perform_xor(begin(test), end(test), begin(test), '&'); 
    copy(begin(test), end(test), ostream_iterator<int>(cout, " ")); 

    cout << endl; 

    perform_xor(begin(test), end(test), begin(test), '&'); 
    copy(begin(test), end(test), ostream_iterator<char>(cout)); 

    return 0; 
} 

siehe: http://ideone.com/ryoNp5

+0

Ein 'std :: string' kann verwendet werden. Die XOR-Operation kann jedoch Zeichenwerte erzeugen, die nicht druckbar sind. –

+0

Das hatte ich in meinen Gedanken;) –