0

ID3のタグ付け仕様を満たすために、この「マジックストリング」を思いつきました。

ID3v2タグサイズは4バイトでエンコードされ、最上位ビット(ビット7)はすべてのバイトでゼロに設定され、合計28ビットになります。ゼロにされたビットは無視されるため、257バイトの長さのタグは$ 00 000201として表されます。

>>> hex_val = 0xFFFFFFFF
>>> str.format('0b{0:07b}{1:07b}{2:07b}{3:07b}', ((hex_val >> 24) & 0xEF),
                                                 ((hex_val >> 16) & 0xEF), 
                                                 ((hex_val >>  8) & 0xEF),
                                                 ((hex_val >>  0) & 0xEF))
'0b11101111111011111110111111101111'

なぜ等しくないのですか:

'0b11111111111111111111111111111111'

誰かが気にするなら、これはうまくいくようです:

>>> int(str.format('0b{0:07b}{1:07b}{2:07b}{3:07b}', ((hex_val >> 24) & 0xFE),
                                                     ((hex_val >> 16) & 0xFE),
                                                     ((hex_val >>  8) & 0xFE), 
                                                     ((hex_val >>  0) & 0xFE)), 2)
4

3 に答える 3

2

and と or の操作を混同していると思います。

  • bitwise and: 両方のオペランドにあるビットのみが設定された数値を返します。
  • ビットごとの or: オペランド セットのいずれかにあるビットを含む数値を返します。
于 2009-10-28T17:10:19.953 に答える
1

&演算子を使用して 4 番目のビットをマスクしているため、すべてが 1 になるわけではありません。

于 2009-10-28T17:16:46.913 に答える
1

7とEを混同してすみません

修正されたコード:

>>> str.format('0b{0:07b}{1:07b}{2:07b}{3:07b}', ((hex_val >> 24) & 0x7F),
                                                 ((hex_val >> 16) & 0x7F),
                                                 ((hex_val >>  8) & 0x7F),
                                                 ((hex_val >>  0) & 0x7F))
于 2009-10-28T17:13:57.417 に答える