1

我正在尝试用 Python 编写我自己的小 PNG 阅读器。文档中有一些我不太明白的东西。在第 3.3 章(处理块的地方)它说:

类型代码的四位,即每个字节的位 5(值 32),用于传达块属性。这种选择意味着人类可以根据类型代码的每个字母是大写(第 5 位为 0)还是小写(第 5 位为 1)来读取分配的属性。然而,解码器应该通过数值测试指定位来测试未知块的属性;测试一个字符是大写还是小写是低效的,如果使用特定于语言环境的大小写定义,甚至是不正确的。

好的,所以它明确表示应该测试一个字节是大写还是小写。那么,我如何检查那个位 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为索引(当然是从右边开始)。这就是我要寻找的吗?

4

1 回答 1

2

Python 确实有按位操作。当他们已经给了您位掩码(32 或 0x20)时,您正在以艰难的方式进行操作。

is_critical = (type_code & 0x20) == 0

或者,等效地:

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

(为清楚起见,带有额外的括号)

于 2012-06-09T13:25:20.713 回答