使用大写和小写字母循环Caeser Cipher字符

时间:2016-03-08 01:02:19

标签: python

如何使caeser密码使用大写和小写字母的ASCII字符。如果我只做大写字母,我的代码工作正常。这是我最接近大写和小写字母的尝试,但是如果你这样做,Z并且键= 1,它仍然会给我[字符。所以从ASCII表中,我必须排除字符91-96和任何其他不是大写或小写字母的字符。

4 个答案:

答案 0 :(得分:1)

由于这可能是家庭作业,这里有一些伪代码。

  1. 如果字符为小写,请将ord('a')设置为base。否则 - 如果字符为大写,请将ord('A')设置为base。其他return char
  2. 添加ord(char) - basekey模26。
  3. base添加回结果。
  4. 这个程序可以优化,但这可能是你自己应该做的。

答案 1 :(得分:1)

使用模数运算符可能更容易。所以你需要做的就是检查是否ch.isupper()并减去相应的基值:

def encode(userPhrase, key):
    finalmsg = userPhrase
    word = ""
    for ch in finalmsg:
        base = ord('A') if ch.isupper() else ord('a')
        new_ch = (ord(ch)-base+key) % 26 + base
        word += chr(new_ch)
    return word

>>> encode("HelloWorld", 10)
RovvyGybvn

答案 2 :(得分:0)

首先,ord('a') > new_ch > ord('z')ord('A') > new_ch > ord('Z')都保证是假的,所以他们什么都没有。

其次,你需要单独的条件来处理under和overflow。

def encode(userPhrase, key):
  finalmsg = userPhrase
  word = ""
  for ch in finalmsg:
    new_ch = ord(ch) + int(key)
    if ch.isupper() and new_ch > ord('Z'):
      new_ch -= 26
    elif ch.islower() and new_ch > ord('z'):
      new_ch -= 26
    elif ch.isupper() and new_ch < ord('A'):
      new_ch += 26
    elif ch.islower() and new_ch < ord('a'):
      new_ch += 26
    word += chr(new_ch)
  return word

if __name__ == '__main__':
  print(encode('azAZ', 1)) # 'baBA'
  print(encode('azAZ', -1)) # 'zyZY'

答案 3 :(得分:0)

您的测试中的逻辑是倒退的。如果new_ch 之外 A-Z或a-z范围,您只想进行减法。因此,要以最少的更改来修复代码,您可以执行以下操作:

def encode(userPhrase, key):
    word = ""
    key = int(key)
    for ch in userPhrase:
        new_ch = ord(ch) + key
        if not ((ord('A') > new_ch > ord('Z')) or (ord('a') > new_ch > ord('z'))):
            new_ch -= 26
        word += chr(new_ch)
    return word

#Test
print(encode('xyzXYZ', 3))

<强>输出

abcABC

但正如其他答案所提到的,有更简单的方法可以做到这一点。我可能会使用类似AChampion的代码。