0

我想出了这个“魔术字符串”来满足 ID3 标记规范:

ID3v2 标签大小用四个字节编码,其中最高有效位(第 7 位)在每个字节中设置为零,总共 28 位。零位被忽略,因此 257 字节长的标签表示为 $00 00 02 01。

>>> 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 操作。

  • 按位与:返回一个仅包含两个操作数集中的位的数字。
  • 按位或:返回一个数字,其位在任一操作数集中。
于 2009-10-28T17:10:19.953 回答
1

抱歉让我的 7s 和 Es 感到困惑

更正的代码:

>>> 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 回答
1

它不等于所有的,因为您使用&运算符屏蔽了第 4 位!

于 2009-10-28T17:16:46.913 回答