如何通过显式设置其值来替换字节类型的 python 对象中的单个位

Sim*_*eon 5 python byte replace set bit

假设我有一个字节类型的变量 tmp 并包含零和一。我想通过设置显式值(例如 1)来替换 tmp 中第五个位置的值。

我想知道什么是替换类型为“Bytes”的对象(tmp)中各个位的干净方法。我想直接设置。我的尝试不起作用。如果能帮助理解我的方法中的问题,我们将不胜感激。

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
Run Code Online (Sandbox Code Playgroud)

有没有像set_bit_in(tmp,position,bit_value)这样的函数?

Gia*_*oni 0

bytes 对象是 python 中的不可变对象,但您可以对其进行索引和迭代。

不过,您可以将其转换为字节数组,这将是最简单的方法

或者你可以做的就是,例如将其变成一个列表,然后更改值,如下所示:

    tmp_list = list(bin(tmp)[2:])
    tmp_list[3] = '1'
Run Code Online (Sandbox Code Playgroud)

前两个字符被删除([2:]),因为它们始终是'0b',当然这是可选的。

另外,字节是字节的字符串表示形式(因此是不可变的),因此您想要进行的分配= '1'不是= 1

如果转到列表,然后返回,这不是您想要的方式,您也可以只复制字符串表示形式并更改您想要更改的一个元素。

或者,如果您对使用二进制文件感到满意,则可以执行按位运算(对 int 本身)