我的问题是如果在过程中可能丢失了信息,如何检索原始字符串。 我正在审查一个使用字节转换的编码例程:
def encode(string):
encoded = ''
for char in string:
encoded += chr(ord(char) ^ (ord(char) >> 1))
return encoded
如果向右移动一位,我在某些情况下会丢失信息,但我正试图找出一种方法来重建原始字符串,以便
def decode(string):
decoded = ''
for char in string:
decoded += ........
return decoded
因为我丢失了给定字符列表的信息:
In [90]: ord('A') >> 1 << 1
Out[90]: 64
In [91]: ord('B') >> 1 << 1
Out[91]: 66
In [92]: ord('C') >> 1 << 1
Out[92]: 66
是否可以反转编码的字符串?我一直在摸不着头脑,我觉得这可以做到,但我的大脑似乎被困在这里。
答案 0 :(得分:2)
查看最高位。它未进行异或或其他修改。所以你知道。第二个最高位的位是与您已知的最高位的XOR。
所以你可以撤消这个XOR,也有第二高的位。重复此操作直到显示所有位。此外,最低有效位的信息也不会丢失。它仅与第二个LSB进行异或。
我不知道这是否是最有效的方式,但我会将编码的字节(我们将其命名为$(document).on('mouseover', '.image_slider', function() {
setInterval(function (e){
slider (this)
}.bind (this), 10000);
});
function slider(that){
console.log(that);
}
)与eb
进行异或。
结果是
eb >> 1
(此处eb2 = eb ^ eb >> 1 # == char ^ char >> 2
表示字节值)
然后
char
对于字节eb3 = eb2 ^ eb2 >> 2 # == char ^ char >> 4
eb4 = eb3 ^ eb3 >> 4 # == char ^ char >> 8
因此char >> 8 == 0
。
答案 1 :(得分:2)
def decode(string):
return string.translate({i ^ i>>1: i for i in range(128)})
演示:
>>> encode('StackOverflow')
'zNQR^hMWKUZXL'
>>> decode(encode('StackOverflow'))
'StackOverflow'
一个微不足道的实验证据证明它有效:
>>> len({i ^ i>>1 for i in range(128)})
128
128个可能的输入导致128个不同的输出,因此没有两个不同的字符被编码为相同的字符,因此可以反转该过程。