0

我正在尝试使用以下代码使用 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;
}

g++ (tdm-1) 4.5.1在 Windows 6.1(七)上使用 (MinGW) 进行编译,它编译时没有错误或警告。当我尝试运行时,它显示“app.exe停止工作。Windows可以在线检查是否有解决问题的方法”的窗口。(类似的东西,我的 Windows 不是英文的)。我不知道出了什么问题。

4

3 回答 3

3

您正在尝试修改字符串常量。由于显而易见的原因(它是恒定的),这将不起作用。相反,请执行以下操作:

int main()
{
    char data[] = "any binary string here";
    crypt(data, 22, "key", 3);
    std::cout << data;
}
于 2011-02-26T18:08:18.673 回答
1

这一行是错误的:

char* data = (char*)"any binary string here";

首先,您不应该使用演员表。接下来,字符串文字是一个常量。所以应该是:

const char* data = "any binary string here";

但是你想覆盖它。所以你需要一个不是常量的字符串。像这样:

char data[] = "any binary string here";
于 2011-02-26T18:08:03.950 回答
1

迈克很好地回答了这个问题。您不能修改常量字符串文字。DOS时代已经快结束了。适当的最新生产级 C++ 编译器应该发出带有适当标志的警告。只是为迈克的回答添加一点,这里是常量字符串文字的一个很好的解释 - http://msdn.microsoft.com/en-us/library/69ze775t(v=vs.80).aspx

此外,这是更好的方法:

#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 运算符。对于简单类型,编译器会为你做这个微优化,但是养成一个好习惯是好的。如果您有一个复杂的迭代器,使用后增量可能会损害您的性能关键路径。此外,字符串的硬编码大小容易出错。稍后您或其他人可以更改字符串而忘记更改其长度。更不用说每次你都要去计算字符数。

快乐编码!

于 2011-02-26T18:18:58.213 回答