二进制值的异或列表

XORing list of binary values

我想制作一个对字符串进行编码的简单函数。 思路如下:

  1. 将字符串更改为相应二进制值的列表。
  2. 将选定的数字更改为相应的二进制值。
  3. 相互异或。
  4. 改回字符串。

所以这是我的代码:

def encode (text, key):
textbit=[]
encoded=[]
keybit=bin(key)
for a in text:
    textbit.append(bin(ord(a)))
for x in xrange (0, len(textbit)):
    encoded.append(textbit[x])^(keybit) 
return 0

word='abcdef'
encode(word, 243)

当我尝试 运行 时,返回错误:

TypeError: unsupported operand type(s) for ^: 'NoneType' and 'str'.

你能告诉我如何解决这个问题吗?

您的错误是因为括号:您想要添加异或的结果,但您尝试对 encoded.append(...) returns.

进行异或

但是还有很多其他问题,我已经修复了其中一些但不是全部(您可能想添加一个 return 并也转换回字符串):

def encode(text, key):
    textbit = []
    encoded = []
    for a in text:
        textbit.append(ord(a))
    for x in textbit:
        encoded.append(x ^ key)

word = 'abcdef'
encode(word, 243)

您的代码中存在一些问题(除了其他风格方面的考虑):

首先,您在尝试附加 XOR 表达式的结果时放错了括号:您写的是 encoded.append(textbit[x])^(keybit) 而不是 encoded.append(textbit[x]^keybit)。如错误信息。

但是,即使将您的代码从 encoded.append(textbit[x])^(keybit) 更改为 encoded.append(textbit[x]^keybit) 也会导致 Python 报告错误。事实上,新代码将尝试在两个字符串 textbit[x]keybit 之间执行 XOR,由函数 bin 构建(其中 returns 是一个字符串 - 而不是数字 - 包含整数的二进制表示形式),但 XOR 运算符只接受整数。

然而,第二个问题有一个简单的解决方案:您必须记住,所有整数都以二进制数形式存储在计算机内部。因此,在将它们与二元运算符一起使用之前,无需将它们转换为另一种格式(例如使用 bin)。

考虑到这些因素(并使 encode 函数成为 returns 编码字符串,而不是无用的 0),您的函数变为:

def encode(text, key):
    textbit = []
    encoded = []
    for a in text:
        textbit.append(ord(a))
    for x in textbit:
        encoded.append(chr(x^key)) 
    return ''.join(encoded)

利用list comprehension,你可以做一些简化:

def encode(text, key):
    textbit = [ord(a) for a in text]
    encoded = [chr(x^key) for x in textbit]
    return ''.join(encoded)

摆脱计算textbit的简单临时步骤,函数可以写成:

def encode(text, key):
    encoded = [chr(ord(a)^key) for a in text]
    return ''.join(encoded)

这可以简化为单行函数:

def encode(text, key):
    return ''.join([chr(ord(a)^key) for a in text])

或者,使用 generator expression,如:

def encode(text, key):
    return ''.join(chr(ord(a)^key) for a in text)

这是 Klaus D 推荐的单线