Python 二进制值的XORing列表
我想做一个简单的函数来编码字符串。 其思路如下:Python 二进制值的XORing列表,python,binary,Python,Binary,我想做一个简单的函数来编码字符串。 其思路如下: 将字符串更改为相应二进制值的列表 将所选数字更改为相应的二进制值 异或与彼此 变回字符串 这是我的代码: 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
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:不支持的操作数类型为^:“非类型”和“str”
你能告诉我如何解决这个问题吗?你的错误是因为括号:你想添加xor的结果,但你试图对
编码的内容进行xor。追加(…)
返回
但它们还有许多其他问题,我已经修复了其中一些问题,但不是全部问题(您可能也希望添加一个返回并转换回字符串):
代码中有几个问题(除了其他风格方面的考虑): 首先,在尝试附加XOR表达式的结果时,您将括号放错了位置:您编写了
encoded.append(textbit[x])^(keybit)
,而不是encoded.append(textbit[x]^keybit)
。错误的括号导致Python尝试在append
(总是None
)的结果和keybit
(错误消息报告的字符串)之间执行异或
但是,即使将代码从encoded.append(textbit[x])^(keybit)
更改为encoded.append(textbit[x]^keybit)
也会导致Python报告错误。事实上,新代码将尝试在两个字符串textbit[x]
和keybit
之间执行异或,这两个字符串由函数bin
构建(它返回一个字符串,而不是一个数字,包含整数的二进制表示),但异或运算符只接受整数
然而,第二个问题有一个简单的解决方案:您必须记住,所有整数都作为二进制数存储在计算机内部。因此,在将它们与二进制运算符一起使用之前,无需将它们转换为另一种格式(例如使用bin
)
考虑到这些因素(并使encode
函数返回编码字符串,而不是无用的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)
利用,您可以进行一些简化:
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])
或者,使用,例如:
这是Klaus D建议的一行程序。请删除
xrange
,并直接迭代textbit
。对于您的问题,请尝试删除给出数字字符串的bin
。您可以将其作为一行:'.join([chr(ord(i)^key)表示文本中的i])
。
def encode(text, key):
return ''.join([chr(ord(a)^key) for a in text])
def encode(text, key):
return ''.join(chr(ord(a)^key) for a in text)