这里的简单问题。 XOR运算符出现问题(^)。我可以很好地XOR整数并获得正确的结果;然而,当XORing两个字符时,没有返回任何内容:
int main() {
char a = 'a';
char b = 'b';
char c;
c = a^b;
cout << c << endl;
}
什么都没发生。没有输出。我在这做错了什么。我正在尝试使用它来对给定密钥的字符串进行XOR加密,但是这个操作遇到了问题。我想我可以得到ASCII值并将其转换为相应的char,但是这个工具将用于加密文件和纯文本,所以我想不惜一切代价避免这种情况。
答案 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::cout
是std::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;但你的控制台不会显示它(因为它再次是一个不可打印的角色)。