2017-12-09 1 views
0

Ich versuche, file_1.txt mit einem eingegebenen Schlüssel zu verschlüsseln und das Ergebnis an file_2.txt auszugeben. Der Professor gab an, dass die Datei in 100 Bytes gleichzeitig gelesen werden muss.Variabler int-Schlüssel, der sich unerklärlicherweise ändert, nachdem er mehrfach als XOR-Operation verwendet wurde

int main(int argc, char *argv[]){ 
int key; 
key = atoi(argv[1]); 

FILE *file_pointer; 
file_pointer = fopen(argv[2], "rb"); 

char buffer[100]; 
char output[sizeof(int)][100]; 
int output_counter = 0; 
int read_counter; 
int read_elements; 
int buffer_reset_counter; 
for(buffer_reset_counter = 0; buffer_reset_counter < 100; buffer_reset_counter++){ 
    buffer[buffer_reset_counter] = 0; 
    } 
while(read_elements = fread(buffer, 1, 100, file_pointer) > 0){ 
    read_counter = 0; 
    while(read_counter < 100){ 
     printf("xor'ing %d and %d\n", key, buffer[read_counter]); 
     output[output_counter][read_counter] = buffer[read_counter]^key; 
     read_counter = read_counter + 1; 
     } 
    output_counter = output_counter + 1; 
    for(buffer_reset_counter = 0; buffer_reset_counter < 100; buffer_reset_counter++){ 
     buffer[buffer_reset_counter] = 0; 
     } 
} 

fclose(file_pointer); 

file_pointer = fopen(argv[3], "wb"); 
int write_counter = 0; 
while(write_counter < output_counter){ 
    fwrite(output[write_counter], 1, 100, file_pointer); 
    write_counter = write_counter + 1; 
    } 
} 

file_1.txt ist die Zeichenfolge "test file for testing\n" 100-mal wiederholt.

Die Ausgabe der Drucke waren wie für die ersten paar hundert Drucke erwartet, aber dann der Schlüssel geändert:

xor'ing 111 and 115 
xor'ing 111 and 116 
xor'ing 111 and 105 
xor'ing 111 and 110 
xor'ing 111 and 103 
xor'ing 111 and 10 
xor'ing 111 and 116 
xor'ing 111 and 101 
xor'ing 111 and 115 
xor'ing 111 and 116 
xor'ing 111 and 32 
xor'ing 111 and 102 
xor'ing 111 and 105 
xor'ing 111 and 108 
xor'ing 111 and 101 
xor'ing 111 and 32 
xor'ing 111 and 102 
xor'ing 111 and 111 
xor'ing 111 and 114 
xor'ing 111 and 32 
xor'ing 111 and 116 
xor'ing 111 and 101 
xor'ing 111 and 115 
xor'ing 111 and 116 
xor'ing 111 and 105 
xor'ing 6 and 110 
xor'ing 26630 and 103 
xor'ing 6383622 and 10 
xor'ing 207710214 and 116 
xor'ing 207710214 and 101 
xor'ing 207710214 and 115 
xor'ing 207710214 and 116 
xor'ing 207710214 and 32 
xor'ing 207710214 and 102 
xor'ing 207710214 and 105 
xor'ing 207710214 and 108 
xor'ing 207710214 and 101 
Segmentation fault (core dumped) 

Ich weiß nicht, wie Schlüssel verändert. Wenn es relevant ist, printf("%d", sizeof(int)); ausgegeben 4.

Früher habe ich eine Frage (stackoverflow.com/q/47732691/905902) in Bezug auf Junk, die in die Puffer-Array, weil es nicht initialisiert wurde, bevor Sie fread(). Das Problem ist diesmal, dass der Schlüssel sich unerwartet ändert.

+0

https://Stackoverflow.com/q/47732691/905902 duplizieren. – wildplasser

+0

Mögliches Duplikat von [C fread() in einer kurzen Datei produziert Junk nach dem Ende der Datei] (https://stackoverflow.com/questions/47732691/c-fread-on-short-file-isproducing-junk-after -the-file-ends) – wildplasser

+0

Das war ich früher, als ich ein Problem mit Junk-Elementen hatte, die von einem nicht initialisierten Array kamen. Das Problem besteht diesmal darin, dass sich die Schlüsselvariable unerwartet ändert. –

Antwort

1

In der Erklärung:

output[output_counter][read_counter] = buffer[read_counter]^key; 

output_counter kann als sizeof(int) größer sein, wenn die Schleife sie in Läufen mehr als viermal so hoch ist, das heißt, es gibt mehr als 400 Bytes (glaube ich) in der Datei. Wenn dies geschieht, überschreibt die XOR-Operation den Stapel, der in den Speicher für key schreibt.

Höheres Niveau, möchten Sie wirklich lernen, ein Werkzeug wie valgrind oder Clang-Adresse Sanitizer zu verwenden, wie sie solche Probleme sehr schnell finden.

Verwandte Themen