How to perform bitwise boolean operations on bytes() in Python3
Performing bitwise operations on bytes() instances in Python3.2+ is easy but not straightforward:
- Use
int.from_bytes(...)
to acquire an integer representing the byte array - Perform bitwise operations with said integer
- Use
result.to_bytes(...)
to convert back the integer to abytes()
array
Note that for the result to make any sense, you need to ensure that both bytes() instances have the same length.
Python code:
def bitwise_and_bytes(a, b):
result_int = int.from_bytes(a, byteorder="big") & int.from_bytes(b, byteorder="big")
return result_int.to_bytes(max(len(a), len(b)), byteorder="big")
def bitwise_or_bytes(a, b):
result_int = int.from_bytes(a, byteorder="big") | int.from_bytes(b, byteorder="big")
return result_int.to_bytes(max(len(a), len(b)), byteorder="big")
def bitwise_xor_bytes(a, b):
result_int = int.from_bytes(a, byteorder="big") ^ int.from_bytes(b, byteorder="big")
return result_int.to_bytes(max(len(a), len(b)), byteorder="big")
Example usage:
a = bytes([0x00, 0x01, 0x02, 0x03])
b = bytes([0x03, 0x02, 0x01, 0xff])
print(bitwise_and_bytes(a, b)) # b'\x00\x00\x00\x03'
print(bitwise_or_bytes(a, b)) # b'\x03\x03\x03\xff'
print(bitwise_xor_bytes(a, b)) # b'\x03\x03\x03\xfc'