在凯撒密码编码中包装字符

Wrapping chars in caesar cipher encode

谁能解释一下 Caesar 移位代码中 a-to-z 和 A-to-Z 之间的字符换行是如何发生的?

k %= 26;

for(int i = 0; i < n; i++){
    int c = s[i];
    if(c >= 'a' && c <= 'z'){
        c += k;
        if( c > 'z'){
            c = 96 + (c % 122); // wrapping from z to a?
        }
    }
    else if(c >= 'A' && c <= 'Z'){
        c += k;
        if(c > 'Z'){
            c = 64 + (c % 90);
        }
    }
    cout << (char)c;
}

K 是移位量,c 是字符串 s 的一个字符。

有没有更好的方法来做到这一点?

让我们对代码进行一些更改,这样可以更容易地看到发生了什么

for(int i = 0; i < n; i++){
    int c = s[i];
    if(c >= 'a' && c <= 'z'){
        c += k;
        if( c > 'z'){
            c = 'a' + (c % 'z') - 1; // wrapping from z to a?
        }
    }
    else if(c >= 'A' && c <= 'Z'){
        c += k;
        if(c > 'Z'){
            c = 'A' + (c % 'Z') - 1;
        }
    }
    cout << (char)c;
}

所以在 c = 'a' + (c % 'z') - 1; 中如果 c 大于 z 那么我们 mod c 通过 z(122) 得到如何我们需要离开 a 中的许多角色。同样的事情也发生在大写字母上。我在这里减去一个,因为我们从 a 开始,而不是像原始代码那样从 a 之前的字符开始。