2

这里简单的问题。XOR 运算符 (^) 有问题。我可以很好地异或整数并得到正确的结果;但是,当对两个字符进行异或运算时,不会返回任何内容:

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

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

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

4

4 回答 4

5

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

于 2012-09-19T23:58:58.767 回答
2

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

于 2012-09-19T23:54:56.210 回答
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;
}
于 2012-09-20T00:05:35.753 回答
1

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

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,它将输出无格式字符。但是请注意,因为如果您尝试写出一个不可打印的字符,它会“工作”,但您的控制台不会显示它(因为再次,它是一个不可打印的字符)。

于 2012-09-20T01:48:55.183 回答