Простой вопрос здесь. Возникла проблема с оператором XOR (^). Я могу XOR нормально целых и получить правильные результаты; однако, когда XORing два символа, ничего не возвращается:
int main() {
char a = 'a';
char b = 'b';
char c;
c = a^b;
cout << c << endl;
}
Ничего не произошло. Нет вывода. Что я тут не так делаю. Я пытаюсь использовать это, чтобы XOR зашифровать строку с заданным ключом, но у меня возникли проблемы с этой операцией. Я думаю, я мог бы получить значение ASCII и преобразовать его в соответствующий ему символ, но этот инструмент будет использоваться для шифрования файлов, а также простого текста, поэтому я хотел бы избежать этого любой ценой.
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
, он выведет неформатированные символы. Остерегайтесь, однако, потому что, если вы попытаетесь написать непечатный символ, он будет «работать», но ваша консоль не покажет его (потому что, опять же, это непечатный символ).
'a' ^ 'b'
(0x61 ^ 0x62
) результаты в 3
, который является непечатный символ, ASCII ETX
Таким образом, нет распечатки.
Результат 'a' ^ 'b'
непечатный символ, а именно '\3'
,
Попробуй это.
#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;
}