Python中的字节到位操作

3

我在Python程序中读取了一个bmp文件。一旦我读取了字节,我想对每个读取的字节进行位运算。我的程序如下:

with open("ship.bmp", "rb") as f:
    byte = f.read(1)
    while byte != b"":
        # Do stuff with byte.
        byte = f.read(1)
    print(byte)

输出:

b'\xfe' 

我想知道如何对它进行操作?即将其转换为位。一些通用的指针会很好。我缺乏Python方面的经验,所以任何帮助都将不胜感激!


1
这是Python 2还是3?看起来像是3,但最好确定一下,在这种情况下它们是不同的。 - Mark Ransom
2
不相关的,但是你可以将while改为for循环for byte in iter(lambda:f.read(1),b"") - Padraic Cunningham
1
也许他想要更好的可读性。 - mbomb007
1
@mbomb007,除非你是史蒂维·汪达那样的人,否则请确保你的代码易于阅读。 - Padraic Cunningham
1
@PadraicCunningham 这绝对不是那么易读的。许多语言都有while循环。但没有多少语言有一个名为iter或完全相同的lambda语法的函数。使用while更容易阅读和理解。 - mbomb007
显示剩余9条评论
2个回答

2

bytes对象在索引时会返回0到255之间的整数。因此,只需对索引结果进行位操作即可。

3>> b'\xfe'[0]
254
3>> b'\xfe'[0] ^ 0x55
171

一个提示。否则结果就没有意义了。 - Kroltan
@Dunes:我修改了我的Python 3.x提示符,这样我就可以轻松区分一个终端中的3.x和另一个终端中的2.x。两者的正常提示符都是“>>>”。 - Ignacio Vazquez-Abrams

2

file.read(1) 构造了一个长度为1的字节对象,如果你只需要将字节作为整数来访问,那这就有点过度设计了。如果想要访问每个字节作为一个整数,则以下方法更加简洁,且使用for循环的好处更大。

with open("ship.bmp", "rb") as f:
    byte_data = f.read()

for byte in byte_data:
    # do stuff with byte. eg.
    result = byte & 0x2
    ...

谢谢,如果我想访问一个字节的位,我该怎么做? - jamesb1082
byte = 7;index = 7;bit = (byte << index >> 7) % 2;print bit - mbomb007
或者,如果您希望第0位比特位于最右侧,请改用 byte << 7-index >> 7 - mbomb007
我不得不使用 % 2,因为Python没有无符号右移,因为它没有无符号数。 - mbomb007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接