Python PNG块类型代码位#5

Python PNG块类型代码位#5,python,png,file-format,bit,Python,Png,File Format,Bit,我正试图用Python编写我自己的小PNG阅读器。这本书里有些东西我不太明白。在第3.3章(处理块的地方)中,它说: 类型代码的四位,即每个字节的第5位(值32),用于传递块属性。这 选择意味着人类可以根据类型的每个字母 代码为大写(第5位为0)或小写(第5位为1)。然而,解码器应该测试未知数据的属性 通过对指定位进行数字测试来实现数据块;测试字符是大写还是小写 如果使用特定于区域设置的案例定义,则效率低下,甚至不正确 好的,所以它明确表示应该而不是测试一个字节是大写还是小写。那么,如何检查第5

我正试图用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索引(当然是从右边)。这就是我要搜索的吗?

Python确实有按位操作。当他们已经给了您位掩码(32或0x20)时,您的操作非常困难

或者,相当于:

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

is_critical=(键入_code&(0x1-Ha-right)我没有想到xD,谢谢。顺便说一句,32的十六进制不是0x20吗?如果你觉得有用,我已经用Java编写了一个PNG读写器(完整,除了交错),它是开源的:
is_critical = (type_code & (0x1 << 5)) == 0