我正在尝试用C ++加密和解密文件,使用以下代码:
#include <iostream>
void crypt(char* pData, unsigned int lenData, const char* pKey, unsigned int lenKey)
{
for (unsigned int i = 0; i < lenData; i++)
pData[i] = pData[i] ^ pKey[i % lenKey];
}
int main()
{
char* data = (char*)"any binary string here";
crypt(data, 22, "key", 3);
std::cout << data;
}
我在Windows 6.1(Seven)上使用g++ (tdm-1) 4.5.1
(MinGW)进行编译,它编译时没有错误或警告。当我尝试运行时,它会显示一个“app.exe停止工作的窗口。如果有问题的解决方案,Windows可以在线检查。” (有些事情,我的Windows不是英文)。我不知道出了什么问题。
答案 0 :(得分:3)
您正在尝试修改字符串常量。出于显而易见的原因(它是常量),这将不起作用。相反,这样做:
int main()
{
char data[] = "any binary string here";
crypt(data, 22, "key", 3);
std::cout << data;
}
答案 1 :(得分:1)
这一行错了:
char* data = (char*)"any binary string here";
首先,你不应该使用演员表。接下来,字符串文字是常量。所以它应该是:
const char* data = "any binary string here";
但是你想要覆盖它。所以你需要一个不是常量的字符串。像这样:
char data[] = "any binary string here";
答案 2 :(得分:1)
此外,这是更好的方法:
#include <iostream>
void crypt(char* pData, unsigned int lenData, const char* pKey, unsigned int lenKey)
{
for (unsigned int i = 0; i < lenData; ++i)
pData[i] ^= pKey[i % lenKey];
}
int main()
{
char data[] = "any binary string here";
const char key[] = "key";
crypt (data, sizeof(data) - 1, key, sizeof (key) - 1);
std::cout << data << std::endl;
}
注意后增量运算符,^=
和sizeof运算符。对于简单类型,编译器会为您进行微优化,但养成良好的习惯是好的。如果您有一个复杂的迭代器,使用后增量会对性能关键路径造成伤害。此外,字符串的硬编码大小容易出错。稍后您或其他人可以更改字符串并忘记更改其长度。更不用说每次你必须去计算字符数。
快乐的编码!