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')