使用字节移位解码编码的最佳方法

时间:2017-12-16 10:12:50

标签: python bit-manipulation bitwise-operators bit-shift

我的问题是如果在过程中可能丢失了信息,如何检索原始字符串。 我正在审查一个使用字节转换的编码例程:

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

是否可以反转编码的字符串?我一直在摸不着头脑,我觉得这可以做到,但我的大脑似乎被困在这里。

2 个答案:

答案 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)

迈克尔的回答证明了这是可能的,这是一个微不足道的,可能很快的方法,使用反向查找表(这里只做ASCII):

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个不同的输出,因此没有两个不同的字符被编码为相同的字符,因此可以反转该过程。