我正在尝试用Python编写自己的小PNG阅读器。 documentation中有些内容我不太明白。在第3.3章(处理块的地方)中,它说:
类型代码的四位,即每个字节的位5(值32),用于传递块属性。这个 选择意味着人类可以根据类型的每个字母读取指定的属性 代码是大写(第5位为0)或小写(第5位为1)。但是,解码器应该测试未知的属性 通过数字测试指定的位来组块;测试字符是大写还是小写 如果使用特定于语言环境的案例定义,则效率低下甚至不正确。
好的,所以它明确表示应该不测试一个字节是大写还是小写。那么,我该如何检查 bit 5 ?
此外,文档说明
辅助位:第一个字节的第5位
0(大写)=临界,1(小写)=辅助。
我有以下函数将整数转换为位流:
def bits(x, n):
""" Convert an integer value *x* to a sequence of *n* bits as a string. """
return ''.join(str([0, 1][x >> i & 1]) for i in xrange(n - 1, -1, -1))
例如,取sRGB
块。小写s
表示块是辅助的。但比较大写S
和小写s
01110011
01010011
我们可以看到在这两种情况下,第5位都是零。
我认为我对计算位数有错误的理解。由于唯一改变的位是第三位(即用2索引),我认为这是我正在寻找的位?它也是右边的第6位,用 5 (从右边开始)索引。这是我正在寻找的吗?
答案 0 :(得分:2)
Python确实有按位操作。当他们已经为你提供了位掩码(32或0x20)时,你正在以艰难的方式去做。
is_critical = (type_code & 0x20) == 0
或等同于:
is_critical = (type_code & (0x1 << 5)) == 0
(为了清楚起见,附加括号)