1

私はPythonで自分の小さなPNGリーダーを書こうとしています。ドキュメントに私がよく理解していないことがあります。3.3章(チャンクが処理される場所)では、次のように述べています。

タイプコードの4ビット、つまり各バイトのビット5(値32)は、チャンクプロパティを伝達するために使用されます。この選択は、タイプコードの各文字が大文字(ビット5が0)であるか小文字(ビット5が1)であるかに応じて、割り当てられたプロパティを人間が読み取ることができることを意味します。ただし、デコーダーは、指定されたビットを数値でテストすることにより、未知のチャンクのプロパティをテストする必要があります。文字が大文字か小文字かをテストすることは非効率的であり、ロケール固有の大文字小文字の定義が使用されている場合は正しくありません。

わかりました。つまり、バイトが大文字か小文字かをテストするべきではないことを明示的に示しています。次に、そのビット5を確認するにはどうすればよいですか?

さらに、ドキュメントには次のように記載されています

補助ビット:最初のバイトのビット5
(大文字)=クリティカル、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がゼロであることがわかります。

私はビットを数えることについて間違った理解をしていると思います。変更される唯一のビットは3番目のビット(つまり、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 に答える