Как заменить отдельный бит внутри объекта Python байтов типов, установив его значение явно - PullRequest
0 голосов
/ 27 сентября 2018

Давайте предположим, что у меня есть переменная tmp, которая имеет тип байтов и содержит нули и единицы.Я хочу заменить значение пятой позиции в tmp, установив явное значение (например, 1).

Интересно, как правильно заменить отдельные биты в объекте (tmp), который имеет тип 'Bytes?».Я хотел бы установить его напрямую.Моя попытка не работает.Помощь в понимании проблемы в моем подходе будет высоко оценена.

print(tmp)       # -> b'00101001'
print(type(tmp)) # -> <class 'bytes'>
tmp[3] =  1      # Expected b'00111001' but actually got TypeError: 'bytes' object does not support item assignment

Есть ли такая функция, как set_bit_in (tmp, position, bit_value)?

1 Ответ

0 голосов
/ 27 сентября 2018

Объект байтов является неизменным объектом в Python, хотя вы можете индексировать его и повторять его.

Вы можете превратить его в байтовый массив, и это будет самый простой способ сделать это

Или вы можете, например, превратить его в список, а затем изменить значение следующим образом:

    tmp_list = list(bin(tmp)[2:])
    tmp_list[3] = '1'

Первые два символа удаляются ([2:]), потому чтоони всегда '0b', конечно, это необязательно.

Также байтом является строковое представление байта (следовательно, неизменяемое), таким образом, присваивание, которое вы хотите сделать, это = '1', а не = 1

Если обращение к списку, а затем обратно - это не то, что вам нужно, вы также можете просто скопировать строковое представление и изменить один элемент, который хотите изменить.

В качестве альтернативы вы можете выполнять побитовые операции (на самом int), если вы чувствуете себя комфортно при работе с двоичными файлами

...