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)