1
votes

Opérations au niveau du bit sur une chaîne d'octets et un entier

Je suis en train de convertir du code cython en python, et cela s'est bien passé jusqu'à ce que j'arrive aux opérations au niveau du bit. Voici un extrait du code:

TypeError: unsupported operand type(s) for >>=: 'str' and 'int'

Si je l'exécute, il crachera cette erreur:

in_buf_word = b'\xff\xff\xff\xff\x00'
bits = 8
in_buf_word >>= bits

comment puis-je résoudre ce problème ?


2 commentaires

Quel est votre résultat attendu pour cela? Est-ce que 8 est un montant fixe, ou peut-il être 2 , 29 , 33 ou - 1 ?


bits n'est pas un montant fixe, mais dans mon cas, il est généralement de 8, mais in_buf_word est ce qui serait en quelque sorte dynamique.


3 Réponses :


0
votes

Décaler vers la droite de 8 bits signifie simplement couper l'octet le plus à droite.

Puisque vous avez déjà un objet bytes , cela peut être fait plus facilement:

in_buf_word = in_buf_word[:-1]


0 commentaires

0
votes

Vous pouvez le faire en convertissant les octets en un entier, en le décalant, puis en reconvertissant le résultat en une chaîne d'octets.

in_buf_word = b'\xff\xff\xff\xff\x00'
bits = 8

print(in_buf_word)  # -> b'\xff\xff\xff\xff\x00'
temp = int.from_bytes(in_buf_word, byteorder='big') >> bits
in_buf_word = temp.to_bytes(len(in_buf_word), byteorder='big')
print(in_buf_word)  # -> b'\x00\xff\xff\xff\xff'


0 commentaires

1
votes
print(in_buf_word.tobytes())

2 commentaires

comment le reconvertirais-je en octets?


@EmilBengtsson utilise tobytes (). voir la réponse modifiée par exemple