XOR von char* Arrays



  • Hi Leute,
    ich hab ein Problem mit dem verxoren von mehreren char* Arrays und zwar übernimmt die XOR Funktion eine Liste von Units, welche aus einem Wort und der Größe des Wortes bestehen und soll diese alle miteinander verxoren.

    Beispiel zur Erstellung:
    hallo ^ servus ^ moin = xorUnit

    Beispiel zur Wiederherstellung:
    moin ^ hallo ^ xorUnit = servus

    Allerdings geht dies nicht und ich erhalte nur "serv", da mir die Länge da irgendwie Schwierigkeiten bereitet. Ich hoffe Ihr könnt mit helfen 🙂

    #include <iostream>
    #include <iomanip>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <vector>
    
    using namespace std;
    
    struct UNIT
    {
       int size;
       char *content;
    };
    
    UNIT XOR( vector<UNIT> list )
    {
      char* unit;
      char* temp;
    
      UNIT xorUnit;   
      int unitLength = 0;
      int maxLength = 0;
      int minLength = 0;
      int bigger = 0;
    
      for( int i = 0; i < list.size(); i++ )
      {
        unitLength = list[i].size;
    
        if( minLength == 0 && maxLength == 0 ) 
        {
          maxLength = unitLength;
        }
        else if( unitLength > maxLength )
        {
          minLength = maxLength;
          maxLength = unitLength;
          bigger = 1;
        }
        else if( unitLength < maxLength )
        {
          minLength = unitLength; 
          bigger = 0;
        }
        printf("bigger: %d\n", bigger);
        printf("MaxLänge: %d\n", maxLength);
        printf("MinLänge: %d\n", minLength);   
    
        temp = new char[maxLength];
    
        for(int j = 0; j < minLength; j++)
        {
          temp[j] = list[i].content[j] ^ unit[j];
        }
        for(int j = minLength; j < maxLength; j++)
        {
          temp[j] = list[i].content[j];
        }
        unit = temp;
      }
    
      xorUnit.content = unit;
      if( bigger == 0 ) {
        xorUnit.size = minLength;
      } else {
        xorUnit.size = maxLength;
      }
      bigger = 0;
    
      return xorUnit;
    }
    
    int main(int argc,char **argv) {      
      int i;
    
      vector<UNIT> list;
      vector<UNIT> backupList;
    
      //Eingabeunits
      UNIT input1;
      UNIT input2;
      UNIT input3;
    
      UNIT xorUnit;  
      UNIT output;
    
      input1.size = 5;
      input1.content = "hallo";    
      input2.size = 6;
      input2.content = "servus";  
      input3.size = 4;
      input3.content = "moin";
    
      list.push_back( input1 );
      list.push_back( input2 );  
      list.push_back( input3 );  
    
      for( i = 0; i < list.size(); i++ )
      {
         output = list[i];
         printf("Vector(%d): %s %d\n", i, output.content, output.size);
      }
    
      xorUnit = XOR( list );
      printf("XOR: %s %d\n\n\n", xorUnit.content, xorUnit.size);
    
      backupList.push_back( input3 );
      backupList.push_back( input1 );  
      backupList.push_back( xorUnit );  
    
      for( i = 0; i < backupList.size(); i++ )
      {
         output = backupList[i];
         printf("Vector(%d): %s %d\n", i, output.content, output.size);
      } 
    
      xorUnit = XOR( backupList );
      printf("XOR: %s %d\n", xorUnit.content, xorUnit.size); 
    
      return 0;
    }
    

  • Mod

    Nimm doch std::string für Zeichenketten! Du benutzt da bei deinen char* eine historisch erlaubte Umwandlung von const char* nach char* (Zeile 90 ff.). Auch wenn das erlaubt ist, so gehen doch in aller Regel alle späteren Versuche, die chars zu modifizieren, schief. Weiterhin erzeugst du wunderschöne Speicherlöcher mit deiner manuellen Speicherverwaltung.
    Zu deinem Problem: Keine Ahnung, ich blick da nicht durch. Ich würde einfach das erste Wort nehmen, mit dem nächsten verXORen, bei Bedarf hinten was dranhängen. Fortfahren mit allen Worten. Auch da ist es natürlich günstig, wenn man einen dynamischen String hätte. Dann könnte man sich 90% des Codes sparen (das ist kein Scherz! Eher mehr.), zumal ziemlich sicher das beschriebene Problem genau bei deiner Längenbestimmung auftritt. Ich habe leider gar keinen Plan, wieso du dort machst, was du machst, daher kann ich auf keine bestimmte Zeile als Fehlerursache zeigen. Vermutlich ist der Algorithmus einfach komplett falsch.



  • Nimm doch bitte reines C++, auf Arrays zu arbeiten kann man sich dank der STL meist sparen. So zum Beispiel:

    #include <iostream> 
    #include <iomanip> 
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <string.h> 
    #include <vector> 
    #include <algorithm>
    
    using namespace std; 
    
    string XOR(vector<string> list) 
    { 
    	string xorUnit;  
    	for( int i = 0; i < list.size(); i++ ) 
    	{ 
    		string unit = list[i];
    		if(unit.size() > xorUnit.size())
    			xorUnit.resize(unit.size(), 0);
    
    		transform(unit.begin(), unit.end(), xorUnit.begin(), xorUnit.begin(), bit_xor<char>());
    	}
    	return xorUnit; 
    } 
    
    int main(int argc, char **argv) 
    {
    	string input1 = "hallo";
    	string input2 = "servus";
    	string input3= "moin";
    
    	vector<string> list;
    	list.push_back(input1); 
    	list.push_back(input2);   
    	list.push_back(input3);   
    
    	for(int i = 0; i < list.size(); i++) 
    	{ 
    		string output = list[i]; 
    		printf("Vector(%d): %s %d\n", i, output.c_str(), output.size()); 
    	} 
    
    	string xorUnit = XOR(list); 
    
    	vector<string> backupList; 
    	backupList.push_back(input3); 
    	backupList.push_back(input1);   
    	backupList.push_back(xorUnit);   
    
    	for(int i = 0; i < backupList.size(); i++) 
    	{ 
    		string output = backupList[i]; 
    		printf("Vector(%d): %s %d\n", i, output.c_str(), output.size()); 
    	} 
    
    	xorUnit = XOR( backupList); 
    	printf("XOR: %s %d\n", xorUnit.c_str(), xorUnit.size()); 
    
    	return 0; 
    }
    

    Hoffe das "transform" passt so, konnte das nie wirklich gut...



  • Ah ok vielen Dank euch beiden 🙂 👍



  • Wenn noch

    #include <string.h>
    

    durch

    #include <string>
    

    ersetzt wird, ist es fast perfekt 🤡

    Ich sehe gerade die "printf"s *grusel*


Anmelden zum Antworten