#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main(void)
{
string dest, sr;
int pass;
cout << "需加密或解密的文件位置" << endl;
cin >> dest;
cout << "文件存放位置" << endl;
cin >> sr;
cout << "请输入你要设定的密钥或者原始密钥" << endl;
cin >> pass;
ifstream p(dest, ios::in | ios::binary);
ofstream p1(sr, ios::out | ios::binary);
if (p.is_open())
{
char ch;
while (p.get(ch))
{
ch ^= pass;
p1 << ch;
//p1.put(ch);
}
}
else
{
cout << "no file" << endl;
}
cout << "完成" << endl;
return 0;
}
上面是个异或加密,我用来加密图片和文字(png,jpg,txt),在写的过程中我发现个很有趣的问题,就是将while循环的那句 p.get( ch ) 换成 ( ch = p.get( ) ) != EOF 之后解码出来的结果就是乱码或解析不出来,同时加密的文件大小变成源大小的五分之一,但p.get()应该不会返回超过127的数字,我查询了很久也没头绪,如果有知道的请不吝赐教
【以下回答由 GPT 生成】
问题分析:
问题中的代码片段使用了ifstream的get函数来读取文件的每个字符,并使用异或操作进行加密。然后使用ofstream的<<运算符将加密后的字符写入到新文件中。
问题中提到,当将代码中的while
循环内的代码p.get(ch)
修改为(ch = p.get()) != EOF
后,解码出来的结果变成了乱码或无法解析,并且加密后的文件大小变为源文件大小的五分之一。
原因分析:
造成这种情况的可能是因为(ch = p.get()) != EOF
会将文件的每个字节都读取,包括文件中的EOF字符(-1)。而在C++中,EOF是一个特殊的值(-1),它不能通过异或操作进行正确的解码。
解决方案:
将代码中的 (ch = p.get()) != EOF
修改回 p.get(ch)
,使用get函数逐个读取字符。
考虑更好的加密算法。在上述代码中,只是对文件的每个字符进行了简单的异或操作,并没有实际的加密效果。可以选择更强大的加密算法,如AES、RSA等。
代码示例:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main(void)
{
string dest, sr;
int pass;
cout << "请输入需要加密或解密的文件位置:" << endl;
cin >> dest;
cout << "请输入文件存放位置:" << endl;
cin >> sr;
cout << "请输入要设定的密钥或者原始密钥:" << endl;
cin >> pass;
ifstream p(dest, ios::in | ios::binary);
ofstream p1(sr, ios::out | ios::binary);
if (p.is_open())
{
char ch;
while (p.get(ch))
{
ch ^= pass;
p1 << ch;
}
}
else
{
cout << "找不到文件" << endl;
}
cout << "完成" << endl;
return 0;
}
解决方案已经给出并提供了代码示例,如果还有其他问题请及时提出。
p.get(ch)
这个可能会跳过非ascii字符