输出字符串包含奇怪的字符

时间:2015-06-30 11:52:58

标签: c++

此代码对字符串进行加密并输出加密。但是,它会输出我不理解的字符,如^ XC [^ CEA ^

当我通过调试器运行应用程序时,输出字符串包含这些字符,\ x2 \ x1a \ x1 \ x1e \ x1c_R \ x2

代码在这里

string key("fydfhjg74d2u1oj4134wq87uj97h31cx");
string encrypt(string msg, string key)

{
    // Make sure the key is at least as long as the message
    string tmp(key);
    while (key.size() < msg.size())
        key += tmp;

    // And now for the encryption part
    for (string::size_type i = 0; i < msg.size(); ++i)
        msg[i] ^= key[i];
'   return msg;
}
string decrypt(string msg, std::string key)
{
    return encrypt(msg, key); // lol
}

int main()
{   

    ofstream appfile("C:\\Users\\123024594\\Desktop\\cas.txt", ios_base::app);
    string message;
    cout << "Input string to be ciphered: ";
    cin >> message;
    cin.get();
    cout << std::endl;
    appfile << "Ciphered string: " << encrypt(message, key);
}

这些角色是什么?

3 个答案:

答案 0 :(得分:2)

因为你对消息和键字符串的各个字符进行了按位xor。由于按位运算符不一定会产生可打印字符,因此您将获得非打印字符。

答案 1 :(得分:2)

// And now for the encryption part
for (string::size_type i = 0; i < msg.size(); ++i)
    msg[i] ^= key[i];    // msg[i] ^ key[i]

字符的按位XOR(ASCII值)可能会导致可打印和不可打印的字符,具体取决于值。

答案 2 :(得分:1)

您使用Bitwise XOR。这可能导致32位以下的ASCII字符(32为空格和第一个可打印的ASCII字符)。 如果您希望它是可打印的,您可以在Base64中对结果进行编码或更改加密,以使结果不能低于32。