Можем ли мы применить битовую манипуляцию к строке символов?
Да.
Символ - это целочисленный тип, поэтому вы можете делать с ним все, что можете к любому другому целому числу. Что случилось, когда вы попытались ?
Если это так, всегда ли можно извлечь строку символов из манипулируемой строки?
Нет. иногда можно восстановить исходную строку, но некоторые манипуляции необратимы.
XOR, конкретная операция, о которой вы спрашивали, является самообращающейся, поэтому в этом случае она работает, но не в общем.
Дрянной пример (зависит от набора символов ASCII, не делайте этого в реальном коде для преобразования регистра, et c. et c.)
#include <iostream>
#include <string>
int main() {
std::string s("a");
std::cout << "original: " << s << '\n';
s[0] ^= 0x20;
std::cout << "modified: " << s << '\n';
s[0] ^= 0x20;
std::cout << "restored: " << s << '\n';
}
показывает (в ASCII-совместимой) системе
original: a
modified: A
restored: a
Обратите внимание, что я не преобразовываю сначала «a» в «1100001», а затем использую XOR (каким-то образом) нулевой бит 5, дающий «1000001» а затем преобразовать это обратно в «А». Почему я?
Эта часть вашего вопроса говорит о том, что вы не понимаете разницы между значениями и представлениями: символ всегда хранится в двоичном виде. Вы можете также всегда обращаться с ним так, как если бы он был сохранен в восьмеричном, десятичном или шестнадцатеричном виде - выбор базы влияет только на то, как мы записываем (или печатаем) значение, а не на то, что это значение
Написание шифра Фейстеля, в котором открытый текст и ключ имеют одинаковую длину, является тривиальным:
std::string feistel(std::string const &text, std::string const &key)
{
std::string result;
std::transform(text.begin(), text.end(), key.begin(),
std::back_inserter(result),
[](char a, char b) { return a^b; }
);
return result;
}
Это не сработает, если ключ короче, хотя - правильное зацикливание клавиши оставляется читателю в качестве упражнения.
О, и печать закодированной строки вряд ли будет работать хорошо (если только ваш ключ не является просто последовательностью пробельных символов, как указано выше) .