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
.
我有一个功能。输入将是一个单词,每次每个字符都会添加到结果的移位值中。
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
.