Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Doing a bitwise operation on bytes

I got two objects, a and b, each containing a single byte in a bytes object.

I am trying to do a bitwise operation on this to get the two most significant bits (big-endian, so to the left).

a = sock.recv(1)
b = b'\xc0'
c = a & b

However, it angrily spits a TypeError in my face.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'bytes' and 'bytes'

Is there any way I can perform an AND operation on the two bytes without having to think of the host system's endianness?

like image 555
Chloride Cull Avatar asked Mar 23 '14 16:03

Chloride Cull


2 Answers

A bytes sequence is an immutable sequence of integers (like a tuple of numbers). Unfortunately, bitwise operations are not defined on them—regardless of how much sense it would make to have them on a sequence of bytes.

So you will have to go the manual route and run the operation on the bytes individually. As you only have a single byte each, it’s really simple to do so though. For the same reason you also don’t need to care about endianness, as that’s only applicable when talking about multiple bytes.

So, you could do it like this:

>>> a, b = b'\x12', b'\x34'
>>> bytes([a[0] & b[0]])
b'\x10'
like image 72
poke Avatar answered Sep 28 '22 17:09

poke


A more general answer

def andbytes(abytes, bbytes):
    return bytes([a & b for a, b in zip(abytes[::-1], bbytes[::-1])][::-1])

Though IMO pyhon bytes objects should aready do this....

like image 5
Jason M Avatar answered Sep 28 '22 17:09

Jason M