decode/revert 个字符在 python 中有移位

decode/revert characters with shift in python

我有一个功能。输入将是一个单词,每次每个字符都会添加到结果的移位值中。

def magic2(b):
res = 0
    for c in b:
       res = (res << 8) + ord(c)
       print(res)
return res

因为它使用轮班,我会丢失一些数据。我想 decode/reverse 使用输入单词的确切字母。

例如,如果输入为 "saman",则输出为结果“495555797358”,逐步为:

115
29537
7561581
1935764833
495555797358

我怎样才能用这些输出返回到输入词?

考虑一下您在做什么:对于每个字符,您向左移动 8 位,然后添加另外 8 位。1

那么,你如何撤销它?那么,对于每个字符,您获取最右边的 8 位,然后将其他所有内容右移 8 位。你怎么知道什么时候完成?当右移 8 位得到 0 时,您一定是刚得到最左边的字符。所以:

def unmagic2(n):
    while n > 0:
        c = chr(n & 0xff) # 0xff is (1 << 8) - 1
        n = n >> 8

现在您只需弄清楚如何处理每个 c 即可取回原始字符串。这并不 相当 像你最初想象的那么微不足道,因为我们最后得到最左边的字符,而不是第一个。不过你应该能从这里弄明白。


1.如果您使用的是 Unicode 的全部范围,这当然是有损的,因为您向左移动了 8 位,然后又添加了另外 21 位,所以没有办法将其反转。但我假设您在这里使用 Latin-1 字符串,或 bytes—或 Python 2 str.