gpt4 book ai didi

python - PNG block 类型代码位 #5

转载 作者:行者123 更新时间:2023-12-01 05:59:58 25 4
gpt4 key购买 nike

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

Four bits of the type code, namely bit 5 (value 32) of each byte, are used to convey chunk properties. This choice means that a human can read off the assigned properties according to whether each letter of the type code is uppercase (bit 5 is 0) or lowercase (bit 5 is 1). However, decoders should test the properties of an unknown chunk by numerically testing the specified bits; testing whether a character is uppercase or lowercase is inefficient, and even incorrect if a locale-specific case definition is used.

好的,所以它明确表示不应该测试一个字节是大写还是小写。那么,我如何检查位 5

此外,文档指出

Ancillary bit: bit 5 of first byte
0 (uppercase) = critical, 1 (lowercase) = ancillary.

我有以下函数将整数转换为位流:

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 block 为例。小写的 s 表示该 block 是辅助的。但是比较大写 S 和小写 s

的比特流
01110011
01010011

我们可以看到,在这两种情况下,#5 位都为零。

我认为我对计算位数确实有错误的理解。由于唯一改变的位是第三位(即索引为 2),我认为这是我正在搜索的位?它也是从右侧算起的第 6 位,并用 5 进行索引(当然是从右侧算起)。这就是我要找的吗?

最佳答案

Python 确实有按位操作。当他们已经给了你位掩码(32 或 0x20)时,你就很难做到这一点。

is_critical = (type_code & 0x20) == 0

或者,等价:

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

(为了清楚起见,使用额外的括号)

关于python - PNG block 类型代码位 #5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10961384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com