XOR运算符C ++

时间:2012-09-19 23:53:44

标签: c++ encryption xor

这里的简单问题。 XOR运算符出现问题(^)。我可以很好地XOR整数并获得正确的结果;然而,当XORing两个字符时,没有返回任何内容:

int main() {
    char a = 'a';
    char b = 'b';
    char c;

    c = a^b;
    cout << c << endl;
}

什么都没发生。没有输出。我在这做错了什么。我正在尝试使用它来对给定密钥的字符串进行XOR加密,但是这个操作遇到了问题。我想我可以得到ASCII值并将其转换为相应的char,但是这个工具将用于加密文件和纯文本,所以我想不惜一切代价避免这种情况。

4 个答案:

答案 0 :(得分:4)

'a' ^ 'b'0x61 ^ 0x62)会生成3,这是一个不可打印的字符ASCII ETX,因此没有打印输出。

答案 1 :(得分:2)

'a' ^ 'b'的结果是一个不可打印的字符,即'\3'

答案 2 :(得分:2)

试试这个。

#include <iostream>
#include <iomanip>

int main() {
    char a = 'a';
    char b = 'b';
    char c;

    c = a^b;
    std::cout << std::hex << static_cast<int>(c) << std::endl;
}

答案 3 :(得分:1)

std::ostream::operator<<(和std::coutstd::ostream)输出格式化的文本。当你传递char时,它会尝试格式化并输出一个字符(想想ASCII)。如果char不是可打印字符,则不会将其打印出来(原因很明显)。如果您希望它输出格式化的整数,则需要将其强制转换:

char a = 'a'; // 'a' == 0x61
char b = 'b'; // 'b' == 0x62
char c = a ^ b; // 0x61 ^ 0x62 == 0x03
std::cout << static_cast<int>(c) << std::endl;

如果您使用未格式化的输出函数std::ostream::write,它的价值是什么,它将输出未格式化的字符。但是要注意,因为如果你试图写出一个不可打印的角色,那么它将会工作,并且#34;但你的控制台不会显示它(因为它再次是一个不可打印的角色)。