string xor string?



  • [EDIT] Ok, doch ausfürhlicher:

    string foo = "foo";
    string bar = "bar";
    for(int i = 0; i < foo.length(); ++i)
        foo[i] ^= bar[i];
    

    Das mit der variablen Länge bekommst du glaub ich selbst hin.


  • Mod

    Michael E. schrieb:

    []

    genau ➡

    std::string& operator^=(std::string& lhs, const std::string& rhs)
    {
        if( lhs.size() < rhs.size() ) lhs.resize( rhs.size(), '\0' );
        for(std::size_t i = 0; i < rhs.size(); ++i )
        {
            lhs[ i ] ^= rhs[ i ];
        }
        return lhs;
    }
    std::string operator^(const std::string& lhs, const std::string& rhs)
    {
        return std::string( lhs ) ^= rhs;
    }
    


  • Zahnstecker schrieb:

    oh danke, welch zufall, gut zu wissen.
    ich kann auch schon schleifen, sonst würd ich ja dauernd stolpern.
    aber hast n guten humor.

    vllt hat der herr mit so viel ahnung ja auch die güte und kann mir sagen, wie eine schleife auszusehen hätte, bei der ich einzelne chars aus nem string oder char array zusammensetze mit xor ("^").

    dann wäre mir auch geholfen.

    thx 😋

    Na von mir aus:

    std::string s1; //Schlüssel
    std::string s2; //Das hier soll der längere String sein
    size_t i = 0;
    while (s2[i] != std::string::npos){
        s2[i] ^= s1[i % s1.size()];
    }
    

    MFG ChockoCookie

    [edit]
    Da war wohl wer schneller
    [/edit]



  • camper schrieb:

    Michael E. schrieb:

    []

    genau ➡

    Ja genau. Ich find es schön, wenn Fragesteller wirklich nur den Teil haben wollen, den sie nicht können. Du lieferst den ganzen Op.



  • Hallo,
    echte STL-Feteschisten greifen natürlich zu std::transform und sparen sich die handgeschriebene Schleife 😉

    template <class T>
    struct bit_xor : public binary_function<T,T,T>
    {
    	T operator()(const T& lhs, const T& rhs) const 
    	{
    		return lhs ^ rhs;
    	}
    };
    int main()
    {
    	string s1 = ...;
    	string s2 = ...;
    	string s3;
    	assert(s1.length() == s2.length());
             transform(s1.begin(), s1.end(), s2.begin(), back_inserter(s3), bit_xor<char>());
    }
    


  • wie bekommt man denn dann den gexorten string zurück?



  • --- schrieb:

    wie bekommt man denn dann den gexorten string zurück?

    nochmal 'xorren' mit s2. xor ^ xor hebt sich auf.



  • --- schrieb:

    wie bekommt man denn dann den gexorten string zurück?

    Durch den "back_inserter"?


  • Mod

    HumeSikkins schrieb:

    Hallo,
    echte STL-Feteschisten greifen natürlich zu std::transform und sparen sich die handgeschriebene Schleife 😉

    gut gespart 😃



  • camper schrieb:

    HumeSikkins schrieb:

    Hallo,
    echte STL-Feteschisten greifen natürlich zu std::transform und sparen sich die handgeschriebene Schleife 😉

    gut gespart 😃

    Ich wollte eigentlich noch auf die "blöde C++ Standardlib" einschlagen, da diese zwar ein logical_* (mit * = and, or, not) aber kein bitwise_xor-Funktionsobjekt mitliefert. Dann dachte ich mir aber, dass ich das lieber euch überlasse 😉


Anmelden zum Antworten