首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定腐烂编码

确定腐烂编码
EN

Stack Overflow用户
提问于 2015-02-16 15:15:07
回答 2查看 1.5K关注 0票数 0

我想确定使用哪种类型的ROT编码,并在此基础上执行正确的解码。

此外,我还找到了以下代码,它们确实可以正确地将rot13 "sbbone“解码为"foobart”:

代码语言:javascript
复制
import codecs
codecs.decode('sbbone', 'rot_13')

问题是,我想对一个具有rot13编码的现有文件运行这个python文件。(例如,ro13.py encoded.txt)。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-16 16:00:11

要回答第一个问题的第二部分,即在ROT-x中解码某些内容,可以使用以下代码:

代码语言:javascript
复制
def encode(s, ROT_number=13):
    """Encodes a string (s) using ROT (ROT_number) encoding."""
    ROT_number %= 26  # To avoid IndexErrors
    alpha = "abcdefghijklmnopqrstuvwxyz" * 2
    alpha += alpha.upper()
    def get_i():
        for i in range(26):
            yield i  # indexes of the lowercase letters
        for i in range(53, 78):
            yield i  # indexes of the uppercase letters
    ROT = {alpha[i]: alpha[i + ROT_number] for i in get_i()}
    return "".join(ROT.get(i, i) for i in s)


def decode(s, ROT_number=13):
    """Decodes a string (s) using ROT (ROT_number) encoding."""
    return encrypt(s, abs(ROT_number % 26 - 26))

要回答第一个问题的第一部分,找到任意编码的字符串的腐烂编码,您可能要使用蛮力。使用所有的腐烂编码,并检查哪一个最有意义。一种快速(-ish)方法是获得一个空格分隔(例如,cat\ndog\nmouse\nsheep\nsay\nsaid\nquick\n...,其中\n是一个换行符)文件,其中包含英语中最常见的单词,然后检查哪个编码中单词最多。

代码语言:javascript
复制
with open("words.txt") as f:
    words = frozenset(f.read().lower().split("\n"))
    # frozenset for speed
def get_most_likely_encoding(s, delimiter=" "):
    alpha = "abcdefghijklmnopqrstuvwxyz" + delimiter
    for punctuation in "\n\t,:; .()":
        s.replace(punctuation, delimiter)
    s = "".join(c for c in s if c.lower() in alpha)
    word_count = [sum(w.lower() in words for w in encode(
            s, enc).split(delimiter)) for enc in range(26)]
    return word_count.index(max(word_count))

您可以在Unix机器上使用的文件是/usr/dict/words,它也可以找到这里

票数 1
EN

Stack Overflow用户

发布于 2015-02-16 15:21:52

你可以逐行读取文件并对其进行解码。输出应该转到输出文件:

代码语言:javascript
复制
import codecs
import sys


def main(filename):
    output_file = open('output_file.txt', 'w')
    with open(filename) as f:
        for line in f:
            output_file.write(codecs.decode(line, 'rot_13')) 
    output_file.close()

if __name__ == "__main__":
    _filename = sys.argv[1]
    main(_filename)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28544530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档