使用索引范围搜索ascii

时间:2017-10-21 21:51:15

标签: python indexing ascii indices caesar-cipher

我正在尝试搜索ascii索引来编写凯撒密码程序,其范围为> = 32且< = 126.当我到达最后一次打印时,我得到一些不在该范围内的字符。我已经尝试过循环和while循环,但不断出错。

如果我没有正确发布,我道歉。这是我的第一篇文章。

感谢您的帮助。

    def cipher(phrase,shift):

        x = list(str(phrase))
        xx = ''.join(list(str(phrase)))

        yy = []
        print(x)
        for c in xx:
            yy.append(chr(ord(c)+shift))

        return ''.join(yy)

    print(cipher('ABCDE', 97 - 65))
    print(cipher('abcde', 65 - 97))
    print(cipher(' !\"#$', 95))     

我的输出是:

['A', 'B', 'C', 'D', 'E']
abcde
['a', 'b', 'c', 'd', 'e']
ABCDE
[' ', '!', '"', '#', '$']

2 个答案:

答案 0 :(得分:0)

这应该有用(请注意我稍微清理了一下代码):

def cipher(phrase, shift):

    x = list(str(phrase))
    yy = ''
    print(x)
    for c in phrase:
        dec = ord(c) + shift
        while dec < 32:
            dec = 127 - (32 - dec)
        while dec > 126:
            dec = 31 + (dec - 126)
        yy += (chr(dec))

    return yy

print(cipher('ABCDE', 97 - 65))
print(cipher('abcde', 65 - 97))
print(cipher(' !\"#$', 95))

输出结果为:

['A', 'B', 'C', 'D', 'E']
abcde
['a', 'b', 'c', 'd', 'e']
ABCDE
[' ', '!', '"', '#', '$']
 !"#$

答案 1 :(得分:0)

我很想知道找到一个使用modulo的解决方案,其范围不是从0开始,所以这就是:

def cipher(phrase, shift):
    """Shift phrase; return original and shifted versions."""
    collector = []
    for c in phrase:
        i = ord(c)
        if i < 32 or i > 126:
            raise ValueError('Char not in range [32, 126]: %s' % c)
        # Shift into range [0, 95)
        i -= 32
        # Apply cipher shift
        i += shift
        # Push the shifted value back into [0, 95) if necessary
        i %= 95
        # Shift back into range [32, 126]
        i += 32
        # Convert to char
        d = chr(i)
        collector.append(d)
    return phrase, ''.join(collector)

print(cipher('ABCDE', 97 - 65))
# -> ('ABCDE', 'abcde')
print(cipher('abcde', 65 - 97))
# -> ('abcde', 'ABCDE')
print(cipher(' !"#$', 95))
# -> (' !"#$', ' !"#$')