PNG块类型代码位#5

时间:2012-06-09 13:19:10

标签: python png file-format bit

我正在尝试用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 (从右边开始)索引。这是我正在寻找的吗?

1 个答案:

答案 0 :(得分:2)

Python确实有按位操作。当他们已经为你提供了位掩码(32或0x20)时,你正在以艰难的方式去做。

is_critical = (type_code & 0x20) == 0

或等同于:

is_critical = (type_code & (0x1 << 5)) == 0

(为了清楚起见,附加括号)