2012-04-09 49 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

相关问题