char* XOR

Fox90

Grünschnabel
Hi Leute,

hab auch ein Problem mit XOR und zwar will es einfach nicht so funktionieren wie ich es mir gedacht habe :( . Ich hab eine Funktion die eine Liste von Units übernimmt, welche alle miteinander verxort werden sollen und diese xor-Unit dann quasi zurückliefert, nur geht dies nicht für alle Fälle :( .

Beispiel:
Erstellen:
hallo^servus^moin = xor

Wiederherstellen:
moin^hallo^xor = servus, aber stattdessen bekomme ich "serv", ersichtlich das es an der Länge liegt nur wie beheb ich das Problem? Bitte um Hilfe oder Rat! :)


Code:
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <stdio.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;
  
  UNIT input1, input2, 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("unit(%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;
}
 
Hallo,
da bis jetzt noch niemand deine Frage beantworten konnte, habe ich mich jetzt des Problems angenommen. Ich habe deinen Code mal durchgeschaut, aber leider weiß ich nicht genau was du eigentlich tun willst.
Verstehe ich es richtig, dass du eigentlich die Zeichen verschiedener Strings nacheinander logisch miteinander verknüpfen willst (mit XOR)?

Falls das so ist, müssen wir die große for-Schleife in UNIT XOR(...) umschreiben, der Algorithmus stimmt an dieser Stelle nicht ganz.
Es würde sich in jedem Fall auch lohnen, wenn wir mal darüber nachdenken eine Hilfsfunktion zu schreiben, die die Verknüpfung für zwei gegebene Strings ausrechnet...

Gruß Technipion
 
Hi, danke aber hat sich erledigt, mein Grundgedanke war halt falsch :( ... so siehts nun aus:

Code:
#include <iostream> 
#include <iomanip> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string> 
#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; 
}
 

Neue Beiträge

Zurück