Je me sens stupide de ne pas pouvoir comprendre cela, mais je suis perdu. J'essaie de XOR deux chaînes C.
#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;
}
Ma sortie est:
$ ./a.out
PlainText One: PlainOne
PlainText Two: PlainTwo
one^two:
Pourquoi le tableau xor ne se lit-il pas comme quoi que ce soit?
Une fois que vous avez affaire à XOR, vous avez affaire à des octets binaires qui peuvent ne pas être imprimables ASCII caractères.
Et lorsque vous XOR les mêmes caractères les uns avec les autres, vous obtenez un 0. Donc 'P' ^ 'P'
Sera 0. C'est un octet NUL et il termine la chaîne. Si vous essayez de imprimer avec printf()
vous n'obtenez rien; printf()
considère la chaîne comme une chaîne de longueur 0 terminée.
En outre, vous devez simplement affecter le résultat XOR dans votre tampon cible avec =
Plutôt que d'utiliser ^=
Comme votre programme l'a fait.
Voici ma version de votre programme et ma sortie:
#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;
}
Production:
PlainText One: PlainOne
PlainText Two: PlainTwo
one^two: 00 00 00 00 00 1B 19 0A 00 00 00 00 00 00 00 00
Remarquez comment les cinq premiers octets sont tous 00
Car Plain
est XOR avec Plain
.
Eh bien "Plain" xor "Plain" == 00000, où 0 est le caractère de terminaison. Les chaînes C s'impriment jusqu'au terminateur, ce qui signifie qu'il n'imprime rien.