Mache eine bitweise operation auf Byte
Habe ich zwei Objekte, a
und b
, die jeweils ein einzelnes byte in ein Byte-Objekt.
Ich versuche zu tun, eine bitweise operation auf diese zu bekommen, die zwei höchstwertigen bits ("big-endian", also auf der linken Seite).
a = sock.recv(1)
b = b'\xc0'
c = a & b
Aber es wütend, spuckt ein TypeError
in mein Gesicht.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'bytes' and 'bytes'
Gibt es eine Möglichkeit, ich kann das ausführen einer UND-operation auf die zwei bytes, die zimmerreserviereung, ohne das Sie denken das host-system ist endianness?
bytes
ist definiert als eine unveränderliche Folge von ganzen zahlen, D. H. es ist eine Liste, wie (im Grunde einconst char[]
). Mache eine bitweise&
auf einer Liste-wie wäre das eigentlich nicht sensical.- Wenn jedes Byte Objekt enthält nur ein byte, dann endianness, ist sinnlos.
- Wenn Sie eine große byte-string, wird es effizienter zu nutzen
c = (int.from_bytes(a, 'big') & int.from_bytes(b, 'big')).to_bytes(max(len(a), len(b)), 'big')
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Byte-Sequenz ist eine unveränderliche Folge von ganzen zahlen (wie ein Tupel von zahlen). Leider bitweise Operationen sind nicht definiert—unabhängig davon, wie viel Sinn es machen würde, Sie auf eine Sequenz von bytes.
So haben Sie zu gehen, die manuelle route und führen Sie die operation auf die bytes einzeln. Da Sie nur ein einzelnes byte, es ist wirklich einfach zu tun, obwohl. Für den gleichen Grund, warum Sie brauchen auch nicht zu kümmern, endianness, wie das ist, nur anwendbar, wenn man über mehrere bytes.
So, man könnte es so machen:
a & b
ausfällt.&
arbeiten auf eine Art von built-in-Liste, aber nicht die andere. Im Grunde genommen, dass&
Arbeit auf ein Byte-array ist, machen einige implizite Annahmen, und Python nicht Graben implisit. Es gibt wohl einige module irgendwo, das wird der boilerplate-Betrieb machen&
Arbeit explizit fürbytes
.