Python:如何从字节中提取特定位?

Adi*_*aka 7 python python-3.x

我有一条信息,上面写着14 09 00 79 3d 00 23 27.我可以通过调用从这个消息中提取每个字节message[4],这将给我3d举个例子.如何从该字节中提取单个8位?例如,我如何获得24-27位作为单个消息?第28位怎么样?

Ani*_*nis 15

要回答问题的第二部分,可以使用按位运算获取特定的位值

# getting your message as int
i = int("140900793d002327", 16)
# getting bit at position 28 (counting from 0 from right)
i >> 28 & 1
# getting bits at position 24-27
bin(i >> 24 & 0b111)
Run Code Online (Sandbox Code Playgroud)

  • 要点是:我想获取位置 24、25 和 26 处的三位值,为此,想法是移位这些位,使位置变为 0 1 和 2,然后与数字执行 AND 运算位置 0 1 2 为 1,其他位置为 0。我本来可以直接写``i>>24 & 7```,但我认为用二进制写会更清楚。 (2认同)

Ian*_*ick 5

最简单的方法是使用 & 运算符。使用将您的消息转换为 int int(str_msg, 16)。使用将 int 转换为二进制字符串bin(myint)

要获取字节中的第 4-6 位(从左起):

>> msg = int("10110111", 2) # or 0b10110111
>> extractor = int("00011100", 2) # or 0b10110111
>> result = msg & extractor
>> print bin(result)
00010100
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以使用对结果进行位移位result >> 2。显然,您希望使其更加动态,但这是一个简单化的示例。

  • 在基数 2 中输入 28 可能比在基数 10 中输入 28 更容易。使用 `0b11100` 可以更清楚地显示您想要哪些位 (2认同)