Побитовые операции над байтовой строкой и int - PullRequest
1 голос
/ 04 мая 2020

Я нахожусь в процессе преобразования некоторого кода Cython в python, и все шло хорошо, пока я не пришел к побитовым операциям. Вот фрагмент кода:

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

Если я выполню это, оно выдаст эту ошибку:

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

как бы это исправить?

Ответы [ 3 ]

1 голос
/ 04 мая 2020
import bitstring

in_buf_word = b'\xff\xff\xff\xff\x00'
bits = 8
in_buf_word  = bitstring.BitArray(in_buf_word ) >> bits

Если у вас его нет. Go на ваш терминал

pip3 install bitstring --> python 3
pip install bitstring --> python 2

Чтобы преобразовать его обратно в байты, используйте метод tobytes ():

print(in_buf_word.tobytes())
0 голосов
/ 04 мая 2020

Вы можете сделать это, преобразовав байты в целое число, сместив его, а затем преобразовав результат обратно в байтовую строку.

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 голосов
/ 04 мая 2020

Сдвиг вправо на 8 бит означает лишь обрезание самого правого байта.

Поскольку у вас уже есть объект bytes, это можно сделать проще:

in_buf_word = in_buf_word[:-1]
...