Faire une opération au niveau du bit sur octets
J'ai deux objets, a
et b
, chacun ne contenant qu'un seul octet en octets de l'objet.
Je suis en train de faire une opération au niveau du bit, afin d'atteindre les deux bits les plus significatifs (big-endian, donc vers la gauche).
a = sock.recv(1)
b = b'\xc0'
c = a & b
Cependant, il avec colère crache un TypeError
dans mon visage.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'bytes' and 'bytes'
Est-il possible que je peux effectuer une opération sur deux octets, sans avoir à penser à l'hôte du système boutisme?
bytes
est défini comme immuable séquence d'entiers, c'est une forme de liste (en gros une const char[]
). Faire un bit à bit &
sur une liste-like ne serait pas très sensés.Lors de chacun des octets de l'objet ne contient qu'un seul octet, puis de l'endianness est dénuée de sens.
Si vous avez une grande chaîne d'octets, il sera plus efficace d'utiliser
c = (int.from_bytes(a, 'big') & int.from_bytes(b, 'big')).to_bytes(max(len(a), len(b)), 'big')
.
OriginalL'auteur Chloride Cull | 2014-03-23
Vous devez vous connecter pour publier un commentaire.
Une séquence d'octets est immuable de la séquence de nombres entiers (comme un n-uplet de nombres). Malheureusement, les opérations au niveau du bit ne sont pas définies sur eux—indépendamment de la façon dont beaucoup de sens, il serait de les avoir sur un séquence d'octets.
De sorte que vous aurez à aller dans le manuel de la route et d'exécuter l'opération sur les octets individuellement. Comme vous avez un seul octet de chaque, c'est vraiment simple à faire. Pour la même raison, vous n'avez pas besoin de se soucier de l'endianness, que c'est uniquement applicable lorsque l'on parle de plusieurs octets.
Donc, vous pouvez le faire comme ceci:
a & b
échoue.Non, pourquoi? Vous avez déjà dit. Et effectivement, je ne suis pas d'accord avec la conception de langage ici. Je ne vois pas pourquoi opérations au niveau du bit ne sont pas fournis pour les octets des objets...
De sorte que les gens simplement en regardant la réponse à l'avenir voir l'explication complète :p Et même si je conviens qu'elle était bizarre, c'est probablement à cause de l'endianness, j'imagine. Et probablement pour des raisons de cohérence avec les autres de la liste-aime, car il sera probablement considérée comme un-pythonic pour une opération comme
&
de travailler sur une sorte de liste, mais pas l'autre. En gros, avoir&
sur un travail d'octets-array est de faire quelques hypothèses implicites, et Python ne pas creuser implisit. Il y a probablement un module de quelque part qui va faire le passe-partout opération afin de faire&
travail explicitement pourbytes
.OriginalL'auteur poke