我有一个函数。输入将是一个单词,每次每个字符都会添加到结果的变化值中。
def magic2(b):
res = 0
for c in b:
res = (res << 8) + ord(c)
print(res)
return res
因为它使用了变化,所以我会丢失一些数据。我想用输入单词的确切字母来解码/逆转。
例如,如果输入将是"萨曼",则输出为" 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
。