2012-04-09 15 views
0

Ich mache ein Chiffrierungs-/Entschlüsselungsprogramm mit XTEA-Algorithmus. Die chiffrieren/dechiffrieren Funktionen funktionieren, aber wenn ich eine Datei verschlüsseln und dann entschlüsseln, bekomme ich einige zusätzliche Zeichen am Ende der Datei hinzu:Ofstream fügt zusätzliche Zeichen zu meiner Ausgabe hinzu

--- Original file --- 
QwertY 

--- Encrypted file --- 
»¦æŸ[email protected]±­ 

--- Deciphered from encrypted --- 
QwertY ß*tÞÇ 

Ich habe keine Ahnung, warum das „ß * tÞÇ“ erscheint schlussendlich. Ich poste etwas von meinem Code, aber nicht alles, da es zu lang wäre. Die Verschlüsselungs-/Entschlüsselungsfunktion benötigt 64 Bit Daten und 128 Bit Schlüssel und verschlüsselt/entschlüsselt die Daten auf die gleiche Blockgröße, die wiederum 64 Bit beträgt(). Es kann dann in eine neue Datei geschrieben werden.

long data[2]; // 64bits 
    ZeroMemory(data, sizeof(long)*2); 
    char password[16]; 
    ZeroMemory(password, sizeof(char)*16); 

    long *key; 
    if(argc > 1) 
    { 
     string originalpath = argv[1]; 
     string finalpath; 
     string eextension = "XTEA"; 
     string extension = GetFileExtension(originalpath); 
     bool encipherfile = 1; 

     if(extension.compare(eextension) == 0) // If extensions are equal, dont encipher file 
     { 
      encipherfile = 0; 
      finalpath = originalpath; 
      finalpath.erase(finalpath.length()-5, finalpath.length()); 
     } 

     ifstream in(originalpath, ios::binary); 
     ofstream out(finalpath, ios::binary); 

     cout << "Password:" << endl; 
     cin.get(password,sizeof(password)); 
     key = reinterpret_cast<long *>(password); 

     while(!in.eof()) 
     { 
      ZeroMemory(data, sizeof(long)*2); 
      in.read(reinterpret_cast<char*>(&data), sizeof(long)*2); // Read 64bits from file 

      if(encipherfile == 1) 
      { 
       encipher(data, key); 
       out.write(reinterpret_cast<char*>(&data), sizeof(data)); 
       continue; 
      } 
      if(encipherfile == 0) 
      { 
       decipher(data, key); 
       out.write(reinterpret_cast<char*>(&data), sizeof(data)); 
      } 
     } 
+0

mögliches Duplikat von [Aus Textdatei lesen, bis EOF die letzte Zeile wiederholt] (http://stackoverflow.com/questions/21647/reading-from-text-file-until-eof-repeats-last-line) –

+0

Danke für die Link, aber ich kann dir versichern, dass dies kein Duplikat ist ... Du siehst in dem Link, den du mir gegeben hast, sie lasen jeweils 1 Zeichen auf einmal. Ich lese einen 64-Bit-Block zu einer Zeit, und obwohl der Block nur 1 Byte vor EOF empfängt, sollte ich noch in der Lage sein, es zu verschlüsseln/zu entschlüsseln, und dann wird die Schleife nicht erneut ausgeführt. – Janman

+2

Der Block empfängt vor dem EOF tatsächlich null Bytes. Sie entziffern und schreiben noch einmal. Der Punkt ist, dass 'in.eof()' uns sagt, ob der vorherige Lesevorgang fehlgeschlagen ist und nicht, ob der nächste Lesevorgang erfolgreich sein wird. –

Antwort

0

prüfen eof unmittelbar nach dem Lesen, und wenn Sie eof Pause aus der Schleife erhalten.

Wenn Sie teilweise haben liest (dh es möglich ist, weniger zu lesen als alle angeforderten Bytes), dann müssen Sie auch gcount anrufen, um herauszufinden, wie viele Bytes Sie tatsächlich lesen, also:

cin.read(...) 
if(cin.eof()) 
    { 
    streamsize bytesRead = cin.gcount(); 
    if(bytesRead > 0) 
     // process those bytes 
    break; 
    } 
+0

Danke für die Antwort, es hilft jedoch nicht. Wenn ich einen Dateiblock lese, lese ich vielleicht nur die Hälfte des Puffers (4 Bytes) und triff dann den eof, und wenn ich aus der Schleife austrete, würden die 4 Bytes einfach verworfen und auch nicht verschlüsselt in die neue Datei geschrieben. – Janman

+0

Geänderte Antwort, um die Möglichkeit eines unvollständigen Puffers zu berücksichtigen. – DRVic

+0

Ah, danke für die Antwort ... Es gibt nur noch eine Sache mit der ich Probleme habe. Warum passiert das nur, wenn ich entziffere? Ich meine, ich benutze fast den gleichen Prozess zum Verschlüsseln-Entschlüsseln. – Janman