-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
+"Òû%÷*&$'
ëÐ!ÐÎ&"# ëÐ"!Ý "

Ü"ÐÎÝ컸
4

1 回答 1

1

因此,假设结果(t += 251 - ((i * 14) & 255))是字符范围内的任何值,您将需要将文件作为“二进制”文件进行读写,否则内容将无法“工作”。

这意味着您需要使用stream::read读取数据块并将stream::write数据写入输出文件,并且当您打开文件时,您需要分别提供ifstream::binaryofstream::binary模式。

文本输入(当您未binary在模式中指定时)会将某些输入字节解释为end of file(停止输入),将其他输入字节解释为newline字符(如果您使用,则getline在输入时将被忽略)。由于在您的加密形式中,您不会使用这些字符来准确表示这些内容,因此您不应使用基于文本的输入(加密文件不是文本文件)。

于 2013-06-30T08:50:40.910 回答