шифрование — переполнение стека операторов XOR

Простой вопрос здесь. Возникла проблема с оператором XOR (^). Я могу XOR нормально целых и получить правильные результаты; однако, когда XORing два символа, ничего не возвращается:

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

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

Ничего не произошло. Нет вывода. Что я тут не так делаю. Я пытаюсь использовать это, чтобы XOR зашифровать строку с заданным ключом, но у меня возникли проблемы с этой операцией. Я думаю, я мог бы получить значение ASCII и преобразовать его в соответствующий ему символ, но этот инструмент будет использоваться для шифрования файлов, а также простого текста, поэтому я хотел бы избежать этого любой ценой.

2

Решение

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, он выведет неформатированные символы. Остерегайтесь, однако, потому что, если вы попытаетесь написать непечатный символ, он будет «работать», но ваша консоль не покажет его (потому что, опять же, это непечатный символ).

1

Другие решения

'a' ^ 'b' (0x61 ^ 0x62) результаты в 3, который является непечатный символ, ASCII ETXТаким образом, нет распечатки.

4

Результат 'a' ^ 'b' непечатный символ, а именно '\3',

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;
}
2
По вопросам рекламы [email protected]