繁体   English   中英

将具有多个字符的字典键视为“一个字符”?

[英]Treat dictionary key with multiple characters as "one character"?

我正在尝试创建一个简单的“翻译器”,以便能够使用字典在二进制和“leetspeak”之间加密/解密 map 键值并在它们之间“翻译”。 它可以很好地将一个字母“加密”为 x 个字符(当然也可以解密它,只要密钥不长于一个字符)但我注意到在尝试将多个字符解密为一个和开始考虑是否有可能以一种相当简单的方式将一个键视为单个字符或类似的东西。

到目前为止,我唯一的建议基本上是自己编写类似于 unicode 的东西,这似乎太过分了,因为我是新手,只是在学习,这不是我想做的事情,至少不是时刻,所以基本上我的问题是它是否是完成同一件事的另一种方法? 即使我必须重写整个事情,使用与我想出的这个 dict-idea 完全不同的方法,它真的会有所帮助。

binary_encrypt = {
    "A": "01000001", "B": "01000010", "C": "01000011", "D": "01000100", "E": "01000101",
    "F": "01000110", "G": "01000111", "H": "01001000", "I": "01001001", "J": "01001010",
    "K": "01001011", "L": "01001100", "M": "01001101", "N": "01001110", "O": "01001111",
    "P": "01010000", "Q": "01010001", "R": "01010010", "S": "01010011", "T": "01010100",
     "U": "01010101", "V": "01010110", "W": "01010111", "X": "01011000", "Y": "01011001",
    "Z": "01011010", "Å": "11000101", "Ä": "11000100", "Ö": "11010110",
 
    "a": "01100001", "b": "01100010", "c": "01100011", "d": "01100100", "e": "01100101",
    "f": "01100110", "g": "01100111", "h": "01101000", "i": "01101001", "j": "01101010",
    "k": "01101011", "l": "01101100", "m": "01101101", "n": "01101110", "o": "01101111", 
    "p": "01110000", "q": "01110001", "r": "01110010", "s": "01110011", "t": "01110100",
    "u": "01110101", "v": "01110110", "w": "01110111", "x": "01111000", "y": "01111001", 
    "z": "01111010", "å": "11100101", "ä": "11100100", "ö": "11110110",
 
    "0": "00110000", "1": "00110001", "2": "00110010", "3": "00110011", "4": "00110100", 
    "5": "00110101", "6": "00110110", "7": "00110111", "8": "00111000", "9": "00111001",
    " ": "00100000", # Whitespace-character
 
    "!": "00100001", "\"": "00100010", "#": "00100011", "¤": "10100100", "%": "00100101",
    "&": "00100110", "/": "00101111", "(": "00101000", ")": "00101001", "=": "00111101", 
    "?": "00111111", "§": "10100111", ",": "00101100", ".": "00101110", "-": "00101101", 
    ";": "00111011", ":": "00111010", "_": "01011111", "<": "00111100", ">": "00111110", 
    "|": "01111100", "´": "10110100", "`": "01100000", "@": "01000000", "£": "10100011", 
    "$": "00100100", "€": "10101100", "{": "01111011", "[": "01011011", "]": "01011101", 
    "}": "01111101", "\\": "01011100"
}
 
binary_decrypt = dict([(value, key) for key, value in binary_encrypt.items()])
 
leetspeak_encrypt = {
    "A": "4", "B": "13", "C": "(", "D": "[)", "E": "3",
    "F": "|=", "G": "6", "H": "|-|", "I": "|", "J": ".]",
    "K": "|<", "L": "1", "M": "|Y|", "N": "/\/", "O": "0",
    "P": "|>", "Q": "0,", "R": "|2", "S": "5", "T": "7",
   "U": "[_]", "V": "\/", "W": "\v/", "X": "}{", "Y": "`/",
    "Z": "2", "Å": "A.", "Ä": "A..", "Ö": "0.."        
}
 
leetspeak_decrypt = dict([(value, key) for key, value in leetspeak_encrypt.items()])    
 
language = input("Language? Binary/Leetspeak: ")
mode = input("Mode? Encrypt/Decrypt: ")
string = input("Enter your string you want to en/decrypt: ")

if language == "binary":
    if mode == "encrypt":
        translated_msg = []
        for letter in string:
            translated_msg.append(binary_encrypt.get(letter, letter) + " ")
        translated_msg = "".join(translated_msg)
        print("Done! Here is your encrypted message [EN]CRYPT -> BINARY:")
        print(translated_msg)
    elif mode == "decrypt": 
        translated_msg = []
        for letter in string:
            translated_msg.append(binary_decrypt.get(letter, letter) + " ")
        translated_msg = "".join(translated_msg)
        print("Done! Here is your decrypted message [DE]CRYPT <- BINARY:")
        print(translated_msg)
elif language == "leetspeak":
    if mode == "encrypt":
        string = string.upper()
        translated_msg = []
        for letter in string:
            translated_msg.append(leetspeak_encrypt.get(letter, letter))
        translated_msg = "".join(translated_msg)
        print("Done! Here is your encrypted message [EN]CRYPT -> LEETSPEAK:")
        print(translated_msg)
    elif mode == "decrypt": 
        translated_msg = []
        for letter in string:
            translated_msg.append(leetspeak_decrypt.get(letter, letter))
        translated_msg = "".join(translated_msg)
        print("Done! Here is your decrypted message [DE]CRYPT <- LEETSPEAK:")
        print(translated_msg)

Output 符合预期(示例尝试解密 leetspeak 中字母 M 值的密钥):

> python .\testchiffer.py
Language? Binary/Leetspeak: leetspeak
Mode? Encrypt/Decrypt: decrypt
Enter your string you want to en/decrypt: |Y|
Done! Here is your decrypted message [DE]CRYPT <- LEETSPEAK:
IYI

预先感谢!

我可能不完全理解您在这里想要什么,但是您不能只拥有另一本字典或直接使用二进制数字表示法,而不是将它们存储为字符串使用0b0011001 ... 吗? 您可以使用仅包含二进制数的表,也可以使用两个带有字符串/二进制的表。

因为01的字符串仅编码 0 和 1 字符而不存储二进制值。

因为好吧,一串字符不能被视为“一个字符”。 你也可以做一个自定义 class 或类似的东西 如果我误解了你的问题,我知道

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM