在Python中如何对两个字符串进行按位异或运算?

55

我想在Python中对两个字符串执行位异或操作,但是Python不允许对字符串进行异或运算。我该怎么做?


4
“按位异或词”的意思是什么?我不太理解... - Olivier Verdier
3
如果这个问题是在2018年提出的话,它永远不可能有机会走到现在这一步。 - DeerSpotter
12个回答

1

我发现使用 ''.join(chr(ord(a)^ord(b)) for a,b in zip(s,m)) 的方法相当慢。相反,我一直在使用以下方法:

fmt = '%dB' % len(source)
s = struct.unpack(fmt, source)
m = struct.unpack(fmt, xor_data)
final = struct.pack(fmt, *(a ^ b for a, b in izip(s, m)))

你可以使用bytearray()代替pack/unpack。 - jfs
实际上,这比struct.pack快约26%:def strxor(a, b, izip=itertools.izip, ba=bytearray): return str(ba((a ^ b for a, b in izip(ba(a), ba(b)))))。请注意,bytearray是在Python 2.6中引入的,而struct.pack适用于Python的早期版本(包括2.4)。 - pts

0

根据William McBrine的答案,这里提供了一个适用于固定长度字符串的解决方案,对于我的使用情况来说速度快了9%:

import itertools
import struct
def make_strxor(size):
    def strxor(a, b, izip=itertools.izip, pack=struct.pack, unpack=struct.unpack, fmt='%dB' % size):
        return pack(fmt, *(a ^ b for a, b in izip(unpack(fmt, a), unpack(fmt, b))))
    return strxor
strxor_3 = make_strxor(3)
print repr(strxor_3('foo', 'bar'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接