一段时间以来,我一直遇到一些真正的麻烦。我在 python 中接收到一串二进制数据,我无法解包和解释数据的 5 位子集(不是整个字节)。似乎想到的任何方法都只是惨败。
假设我有两个字节的二进制数据,我想解释 16 位中的前 10 位。如何将其转换为 2 个整数,每个整数代表 5 位?
使用位掩码和位移:
>>> example = 0x1234 # Hexadecimal example; 2 bytes, 4660 decimal.
>>> bin(example) # Show as binary digits
'0b1001000110100'
>>> example & 31 # Grab 5 most significant bits
20
>>> bin(example & 31) # Same, now represented as binary digits
'0b10100'
>>> (example >> 5) & 31 # Grab the next 5 bits (shift right 5 times first)
17
>>> bin(example >> 5 & 31)
'0b10001'
这里的诀窍是要知道 31 是一个 5 位的位掩码:
>>> bin(31)
'0b11111'
>>> 0b11111
31
>>> example & 0b11111
20
如您所见,0b
如果您发现二进制数字文字符号更易于使用,您也可以使用它。
有关更多背景信息,请参阅有关位操作的 Python Wiki 。