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

标签 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

是否可以反转编码后的字符串?我已经思考了一段时间,我觉得这是可以做到的,但我的大脑似乎卡在了这里。

最佳答案

Michael 的回答证明了这是可能的,这里有一个简单且可能快速的方法,使用反向查找表(这里只做 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 种不同的输出,因此不会将两个不同的字符编码为相同的字符,因此可以逆向进行该过程。

关于python - 使用字节移位解码编码的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47844555/

相关文章:

c - 位摆弄 : which bit is set?

c# - VB.NET 代码返回与 C# 代码不同的结果

java - 如何用位运算替换这个字符串运算?

javascript - `>>>` 在 JavaScript 中意味着什么?

python - Concurrent.futures 在命令行中运行良好,而不是在使用 pyinstaller 编译时

python - 如何在 Python 中垂直连接两个数组?

python - 如何在整个项目的 Python 中仅使用一次记录器为多个模块配置/初始化日志记录?

SELECT/WHERE 中的 python SQL 变量

c++ - 将 32 0/1 值打包到单个 32 位变量的位中的最快方法是什么?

swift - Swift 中的位运算,从信标数据中读取值