Как я сказал в замечании
for (int i=0; i<=10; i++) {
c = ma + i;
if (c > 122) {
c = 97;
}
}
делает
{
int i = 10;
c = ma + i;
if (c > 122) {
c = 97;
}
}
потому что там c переназначен, так что предыдущий ход не влияет на текущий, а учитывается только последний.
Также
for (int b = 0; b>=10; b++) {
nm = cb - b;
if (nm < 97) {
nm = 122;
}
}
ничего не делает, потому что тест b>=10
сразу ложен b со значением 0
Независимо от этих ошибок используемая кодировка необратима для большого количества значений, и нет никаких ограничений на кодируемый символ, он может иметь любой код, поддерживаемый char .
Простой способ кодирования и декодирования состоит в том, чтобы выполнить xor с заданным значением, независимо от того, X для данного Y ((X^Y)^Y) == X)
, таким же образом, для кодирования и декодирования , просто делаю ^Y
в обоих случаях.
Другим обратимым способом является бросок в одном направлении для кодирования, а затем в обратном направлении для декодирования. Предупреждение о броске, а не о сдвиге, чтобы не потерять биты.
Другим способом является кодирование обмена некоторыми битами (например, младшие 4 бита с четырьмя старшими, предполагающими char как минимум 8 бит), и то же самое для декодирования.
Конечно, вы можете смешивать эти способы, а не просто делать один из них.
Конечно, вы можете использовать способ, не основанный на формуле, например, решить для каждой буквы другую для ее замены (a -> Z, b -> 0 и т. Д. И наоборот для декодирования)
Существует бесконечное количество способов кодирования / декодирования