how to do bitwise exclusive or of two strings in python? how to do bitwise exclusive or of two strings in python? python python

how to do bitwise exclusive or of two strings in python?


You can convert the characters to integers and xor those instead:

l = [ord(a) ^ ord(b) for a,b in zip(s1,s2)]

Here's an updated function in case you need a string as a result of the XOR:

def sxor(s1,s2):        # convert strings to a list of character pair tuples    # go through each tuple, converting them to ASCII code (ord)    # perform exclusive or on the ASCII code    # then convert the result back to ASCII (chr)    # merge the resulting array of characters as a string    return ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2))

See it working online: ideone


If you want to operate on bytes or words then you'll be better to use Python's array type instead of a string. If you are working with fixed length blocks then you may be able to use H or L format to operate on words rather than bytes, but I just used 'B' for this example:

>>> import array>>> a1 = array.array('B', 'Hello, World!')>>> a1array('B', [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33])>>> a2 = array.array('B', ('secret'*3))>>> for i in range(len(a1)):    a1[i] ^= a2[i]>>> a1.tostring()';\x00\x0f\x1e\nXS2\x0c\x00\t\x10R'


For bytearrays you can directly use XOR:

>>> b1 = bytearray("test123")>>> b2 = bytearray("321test")>>> b = bytearray(len(b1))>>> for i in range(len(b1)):...   b[i] = b1[i] ^ b2[i]>>> bbytearray(b'GWB\x00TAG')