2012-04-09 85 views
0

我正在使用XTEA算法進行加密/解密程序。該加密器/解密功能正常工作,但是當我加密被一個文件,然後破譯它,我得到一些額外的字符在文件的結尾:Ofstream將額外字符添加到我的輸出中

--- Original file --- 
QwertY 

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

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

我不知道爲什麼「SS *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) – 2012-04-09 09:57:32

+0

感謝您的鏈接,但我可以向你保證這不是重複的......你在你給我的鏈接中看到,他們一次只讀1個字符。我一次讀取一個64位塊,即使塊在EOF之前只接收1個字節,我仍然可以對它進行加密/解密,然後循環將不會再次運行。 – Janman 2012-04-09 11:35:18

+2

該塊實際上在EOF之前接收到零個字節。你仍然破譯並再寫一次。關鍵是'in.eof()'告訴我們上一次讀取是否失敗,而不是下一次讀取是否成功。 – 2012-04-09 12:36:01

回答

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 2012-04-09 15:33:16

+0

修改答案以解決不完整緩衝區的可能性。 – DRVic 2012-04-09 16:16:50

+0

啊,謝謝你的回答...還有一件事我有一些問題。爲什麼只有當我解密時纔會發生這種情況?我的意思是,我使用幾乎相同的過程進行加密 - 解密。 – Janman 2012-04-09 17:42:16

相關問題