XORing二进制值列表

时间:2015-03-21 09:39:08

标签: python binary

我想创建一个编码字符串的简单函数。 这个想法如下:

  1. 将字符串更改为相应二进制值的列表。
  2. 将所选数字更改为相应的二进制值。
  3. 彼此XOR。
  4. 改回字符串。
  5. 所以这是我的代码:

    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:^:'NoneType'和'str'的不支持的操作数类型。

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

2 个答案:

答案 0 :(得分:0)

您的错误是因为括号:您想要添加xor的结果,而是尝试xor encoded.append(...)返回的内容。

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

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)

答案 1 :(得分:0)

您的代码中存在一些问题(除了其他样式方面的考虑因素):

首先,当您尝试附加XOR表达式的结果时,您错放了括号:您编写了encoded.append(textbit[x])^(keybit)而不是encoded.append(textbit[x]^keybit)。错误的括号导致Python尝试在append(始终为None)和keybit的结果之间执行XOR,这是一个字符串,如错误消息所报告的那样。 / p>

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

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

利用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建议的单线。