二进制值的异或列表
XORing list of binary values
我想制作一个对字符串进行编码的简单函数。
思路如下:
- 将字符串更改为相应二进制值的列表。
- 将选定的数字更改为相应的二进制值。
- 相互异或。
- 改回字符串。
所以这是我的代码:
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 推荐的单线
我想制作一个对字符串进行编码的简单函数。 思路如下:
- 将字符串更改为相应二进制值的列表。
- 将选定的数字更改为相应的二进制值。
- 相互异或。
- 改回字符串。
所以这是我的代码:
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 推荐的单线