2015-01-13 7 views
6

Ich fühle mich albern, weil ich nicht in der Lage bin, das herauszufinden, aber ich bin verloren. Ich versuche, zwei C-Saiten zu XOR zu machen.Wie kann ich zwei C-Char-Arrays bitweise XOR XOR?

#include <stdio.h> 
#include <memory.h> 
#include <stdlib.h> 
int main() 
{ 
    char plainone[16]; 
    char plaintwo[16]; 
    char xor[17]; 
    strcpy(plainone, "PlainOne"); 
    strcpy(plaintwo, "PlainTwo"); 
    int i=0; 
    for(i=0; i<strlen(plainone);i++) 
     xor[i] ^= (char)(plainone[i]^plaintwo[i]); 
    printf("PlainText One: %s\nPlainText Two: %s\n\none^two: %s\n", plainone, plaintwo, xor); 
    return 0; 
} 

Meine Ausgabe ist:

$ ./a.out 
PlainText One: PlainOne 
PlainText Two: PlainTwo 

one^two: 

Warum nicht die xor Array als etwas lesen?

+1

1. 'xor' ist Müll, ich bin sicher, Sie wollten es nur zuweisen. 2. P^P = 0 oder \ 0, was das Ende der Zeichenkette bedeutet. – Joe

+0

"strlen" nicht immer wieder in der for-Schleife aufrufen. Speichern Sie die Länge in einer Variablen und verwenden Sie sie –

Antwort

11

Sobald Sie mit XOR arbeiten, handelt es sich um binäre Bytes, die möglicherweise keine druckbaren ASCII-Zeichen sind.

Und wenn Sie die gleichen Zeichen miteinander XOR, erhalten Sie eine 0. So 'P'^'P' wird 0. Das ist ein NUL-Byte und es beendet die Zeichenfolge. Wenn Sie versuchen, mit printf() zu drucken, erhalten Sie nichts; printf() betrachtet die Zeichenfolge als terminierte Länge-0-Zeichenfolge.

Außerdem sollten Sie das XOR-Ergebnis einfach Ihrem Zielpuffer mit = zuweisen, anstatt ^= wie Ihr Programm zu verwenden.

Hier ist meine Version des Programms, und meine Ausgabe:

#include <stdio.h> 
#include <memory.h> 
#include <stdlib.h> 

#define LENGTH 16 
int main() 
{ 
    char const plainone[LENGTH] = "PlainOne"; 
    char const plaintwo[LENGTH] = "PlainTwo"; 
    char xor[LENGTH]; 
    int i; 

    for(i=0; i<LENGTH; ++i) 
     xor[i] = (char)(plainone[i]^plaintwo[i]); 
    printf("PlainText One: %s\nPlainText Two: %s\n\none^two: ", plainone, plaintwo); 
    for(i=0; i<LENGTH; ++i) 
     printf("%02X ", xor[i]); 
    printf("\n"); 
    return 0; 
} 

Ausgang:

PlainText One: PlainOne 
PlainText Two: PlainTwo 

one^two: 00 00 00 00 00 1B 19 0A 00 00 00 00 00 00 00 00 

Beachten Sie, wie die ersten fünf Bytes sind alle 00 weil Plain mit Plain XOR-verknüpft wird.

1

Nun "Plain" xor "Plain" == 00000, waren 0 ist der Terminator char. C-Strings werden bis zum Terminator gedruckt, was bedeutet, dass nichts gedruckt wird.

Verwandte Themen