从文件读取字符并实现反转置换密码解码的技术问询
搞定密文解码与双存储结构实现
嘿,我来帮你解决这个Atbash密码解码+字符存储的问题!首先咱们先把核心逻辑理清楚,再一步步落地实现。
首先,你说的置换规则其实就是Atbash密码——每个字母对应字母表的反向位置,比如A↔Z,B↔Y,以此类推。计算方式很简单:对于大写字母,解码字符的ASCII码等于 ord('A') + ord('Z') - ord(加密字符),小写字母同理用a和z计算,非字母(空格、标点这些)直接保留就行。
先手动解码两条密文,方便你验证逻辑
先把两条密文解出来,确保咱们的规则没搞错:
密文1: SLD NZMB KILTIZNNVIH WLVH RG GZPV GL XSZMTV Z ORTSG YFOY?
解码后: HOW MANY PROGRAMMERS DOES IT TAKE TO CHANGE A LIGHT BULB?
密文2: MLMV, GSZG’H Z SZIWDZIV KILYOVN。
解码后: NOON, THAT’S A HARDWARE PROBLEM.
用Python实现读取、解码与双存储结构
咱们用Python来写代码,因为它处理字符串和数据结构特别顺手。这里选两种典型的存储结构:列表(List)(有序、可重复,完美保留原始字符顺序)和 集合(Set)(无序、自动去重,适合统计唯一字符)。
完整代码
def atbash_decode(char): # 处理字母的反向置换,非字母直接返回原样 if char.isupper(): return chr(ord('A') + ord('Z') - ord(char)) elif char.islower(): return chr(ord('a') + ord('z') - ord(char)) else: return char # 从文件读取密文(假设文件名为cipher.txt,每行一条密文) with open('cipher.txt', 'r', encoding='utf-8') as file: # 读取非空行,过滤掉无效的空内容 cipher_lines = [line.strip() for line in file if line.strip()] # 批量解码所有密文 decoded_lines = [] for cipher in cipher_lines: decoded = ''.join([atbash_decode(c) for c in cipher]) decoded_lines.append(decoded) print(f"解码结果: {decoded}") # 存储结构1:列表——保留所有字符的顺序和重复项 all_chars_list = [] for line in decoded_lines: all_chars_list.extend(list(line)) # 存储结构2:集合——自动去重,只保留唯一出现的字符 unique_chars_set = set() for line in decoded_lines: unique_chars_set.update(line) # 输出验证结果 print("\n列表存储的前20个字符:", all_chars_list[:20]) print("集合存储的所有唯一字符(排序后):", sorted(unique_chars_set))
代码细节说明
atbash_decode函数:专门处理单个字符的解码,兼容大小写,非字母(空格、问号、逗号这些)直接原样返回,避免破坏密文里的格式符号。- 文件读取:用
with语句自动管理文件句柄,读取时跳过空行,避免无效数据干扰。 - 列表存储:把每个解码后的字符串拆成单个字符,逐个加入列表,完全保留原始顺序和重复字符(比如空格、问号会重复出现)。
- 集合存储:把所有字符加入集合,自动去重,适合你需要统计有哪些不同字符的场景。
运行结果示例
运行后你会看到解码后的两条明文,还有列表和集合的输出:
- 列表开头会是
['H', 'O', 'W', ' ', 'M', 'A', 'N', 'Y', ' ', 'P', 'R', 'O', 'G', 'R', 'A', 'M', 'M', 'E', 'R', 'S'] - 集合排序后会包含所有出现过的字符,比如
[' ', '?', ',', "'", 'A', 'B', 'C', 'D', 'E', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V', 'W', 'Y']
内容的提问来源于stack exchange,提问作者Julio
相关产品推荐
相关产品推荐

