2012-04-09 21 views
0

私はXTEAアルゴリズムを使用して暗号化/復号化プログラムを作成しています。 ENCIPHER /解読機能が正常に動作しますが、私は、ファイルを暗号化し、それを解読するとき、私は、ファイルの最後にいくつかの余分な文字を取得します:Ofstreamは出力に余分な文字を追加します

--- Original file --- 
QwertY 

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

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

私は「ß*tÞÇ」が表示され、なぜ分かりません最終的には。 私はコードが長すぎるので、コードの一部を投稿しますが、すべてではありません。暗号化/復号化機能は、64ビットのデータと128ビットのキーを取り、そのデータを同じブロックサイズ、すなわち64ビット(similar functions here)に暗号化/復号化する。新しいファイルに書き込むことができます。

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

[EOFが最後の行を繰り返すまでのテキストファイルからの読み込み]の可能な複製(http://stackoverflow.com/questions/21647/reading-from-text-file-until-eof-repeats-last-line) –

+0

ありがとうリンクが、私はあなたが私に与えたリンクで一度に1文字を読むことがわかります。私は一度に64ビットブロックを読んでいますが、ブロックはEOFの前に1バイトしか受信しませんが、それでも暗号化/復号化できるはずです。そしてループは再び実行されません。 – Janman

+2

ブロックは実際にはEOFの前にゼロバイトを受け取ります。あなたはまだもう一度解読して書きます。ポイントは、 'in.eof()'は前の読み込みが失敗したかどうかを示し、次の読み込みが成功するかどうかを示します。 –

答えて

0

eofの確認、すぐにあなたの読み取り後、あなたは蚊帳の外eof休憩を取得する場合。

あなたは、部分的に(すなわち、要求されたバイトの全てよりも少ないを読み取ることが可能である)、そしてあなたは、このように、あなたが実際に読んでどのように多くのバイトを見つけるためにgcountを呼び出すことも必要読み取っ持つ可能性がある場合:

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

答えをくれてありがとうございます。私はファイルのブロックを読むとき、私はバッファ(4バイト)の半分を読んで、次にeofを打つかもしれません、そして、私がループから抜け出すならば、4バイトはちょうど捨てられ、新しいファイルに書き込まれます。 – Janman

+0

バッファが不完全である可能性を考慮して修正された回答。 – DRVic

+0

ああ、お返事ありがとうございます。私にはいくつか問題があります。なぜこれは私が解読したときだけ起こるのですか?つまり、暗号化/復号化のプロセスはほぼ同じです。 – Janman