2

大家早上好!我一直在尝试将这段用 Python 2 编写的代码转换为 Python 3。这是一个使用 XOR 加密字符串的简单函数。到目前为止我所拥有的:

import binascii

def encrypt(content: str, key: str) -> str:
    key_id = 0
    xored = ""
    for c in content:
        xored += chr(ord(key[key_id % len(key)]) ^ ord(c))
        key_id += 1
    return binascii.hexlify(xored.encode())

def decrypt(content: str, key: str) -> str:
    key_id = 0
    xored = ""
    for c in binascii.unhexlify(content):
        xored += chr(ord(key[key_id % len(key)]) ^ ord(c))
        key_id += 1
    return binascii.hexlify(xored.encode())

Python 2 中的代码完美运行,但是在测试上面的代码(在 Python 3 中)时,我在解码消息时遇到了问题。( encrypt() 函数似乎运行良好。)发生以下错误:

>>> encrypt("foo", "123")
b'575d5c'
>>> decrypt(b"575d5c", "123")
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    decrypt(b"575d5c", "123")
  File "/home/user/Code/Python/xorcrypt.py", line 15, in decrypt
    xored += chr(ord(key[key_id % len(key)]) ^ ord(c))
TypeError: ord() expected string of length 1, but int found

我检查了两个文档,但无法确定版本的任何差异:Python 2 中ord() 和 Python 3 中的 ord()。另外,我搜索了其他来源,但我没有发现任何提及该问题的内容:

什么是 Python ord 函数

将 Python 2 代码移植到 Python 3

备忘单 Python 2 到 3

我在看正确的位置吗?或者在这种情况下 ord() 函数不是问题吗?非常感谢您!

4

1 回答 1

4

区别不在于,ord()而在于binascii.unhexlify()。在 Python 2 中,它返回一个字符串,如果你索引到该字符串,你会得到一个长度为 1 的字符串,你可以调用ord()它。但是在 Python 3 中,它返回 a bytes,如果你对它进行索引,你会得到一个你不能调用的小整数,ord()也不需要。

于 2021-07-16T13:10:43.410 回答