2013-06-30 75 views
-1

我試圖用一個簡單的解密算法來解密一些文件。到目前爲止,我所使用的代碼大部分都能工作,但在幾百字節後停止閱讀並導出它的內容。 例如,我有一個.X文件,它是14.7KB。我通過該程序運行它,它出現爲643字節。 當前的代碼是在這裏:http://pastebin.com/aNNjYTzg 由於格式化這個網站的代碼讓我瘋狂......沒有讀取全部文件

我只是說在算法現有的代碼,所以大部分不使用它。

編輯:

cout << "Enter the name of your file to " << encrypt_decrypt[choice-1] << ": "; 
    cin >> filename; 
    in.open(filename); 

    getline(in,buffer); 

    void encryptdecrypt(const string buffer,const char map[],int len,string& newbuffer) 
    { 
    int i=0; 
    char t; 
    char code; 
    for (i=0;i<buffer.length();i++) 
    { 
      t=buffer[i]; 
      (t += 251 - ((i * 14) & 255)); 
      cout << "Buffer length: " << buffer.length() << endl; 
      cout << "newbuffer length: " << newbuffer.length() << endl; 
      newbuffer.push_back(t); 
    } 
    newbuffer.push_back('\n'); 
    } 
    out << newbuffer; 

EDITx2: 讀取整個文件,但只是剛剛開始部分解密。

<?xml version="1.0"?> 
<Materi 
+"Òû%÷*&$' 
ëÐ!ÐÎ&"# ëÐ"!Ý " 

Ü"ÐÎÝ컸 
+1

我猜這個文件是「二進制的」,並且你試圖將它看作文本... –

+1

請在這裏發佈有趣的部分,你不能指望我們通過線和未使用的代碼行... – filmor

+2

在這個網站上格式化代碼並不困難;突出顯示代碼,然後按ctrl + k – imulsion

回答

1

因此,考慮到的(t += 251 - ((i * 14) & 255))結果是在字符範圍內的任何值,則需要讀取和寫入文件爲「二進制」文件,或內容會不會「工作」。

這意味着你需要使用stream::read讀取數據塊和stream::write將數據寫入到輸出文件,當你打開文件,你需要提供ifstream::binaryofstream::binary respecitvely作爲模式。

文字輸入(當你不指定模式binary)將解釋某些輸入字節end of file(停止輸入)以及其他輸入字節爲newline字符(如果你使用getline將輸入被忽略)。由於在你的加密形式中,你不使用這些字符來表示這些東西,你不應該使用基於文本的輸入(加密文件不是文本文件)。

+0

它現在讀取整個文件,但只有其開頭部分被解密。 – user2536086

+0

對不起,沒有完全理解你的代碼在哪裏出錯了,我不能說。我非常肯定,在XML文檔中存儲二進制數據「好像它是文本」一般來說是個壞主意。您可能希望至少發佈您的新代碼... –

+0

@MatsPetersson我不認爲他在XML中存儲未轉義的二進制文件;它看起來像XML本身正在從二進制「解密」。 – michaelb958