как сделать побитовый эксклюзив или из двух строк в Python? - PullRequest
43 голосов
/ 10 апреля 2010

Я хотел бы выполнить побитовое исключение или две строки в Python, но xor строк не разрешены в Python Как я могу это сделать?

Ответы [ 12 ]

1 голос
/ 10 апреля 2010

Ниже показана XORing строка s с m, а затем снова, чтобы полностью изменить процесс:

>>> s='hello, world'
>>> m='markmarkmark'
>>> s=''.join(chr(ord(a)^ord(b)) for a,b in zip(s,m))
>>> s
'\x05\x04\x1e\x07\x02MR\x1c\x02\x13\x1e\x0f'
>>> s=''.join(chr(ord(a)^ord(b)) for a,b in zip(s,m))
>>> s
'hello, world'
>>>
0 голосов
/ 29 октября 2016

Основываясь на ответе Уильяма МакБрин, вот решение для строк фиксированной длины, которое на 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'))
...