我有一条信息,内容为 14 09 00 79 3d 00 23 27
。通过调用 message[4]
,可以从该消息中提取每个字节,例如会得到 3d
。如何从这个字节中提取单独的8位?例如,如何将24-27位作为单独的消息获取?28位呢?
我有一条信息,内容为 14 09 00 79 3d 00 23 27
。通过调用 message[4]
,可以从该消息中提取每个字节,例如会得到 3d
。如何从这个字节中提取单独的8位?例如,如何将24-27位作为单独的消息获取?28位呢?
回答你问题的第二部分,你可以通过位运算得到特定的比特值。
# 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)
3B 00 00 00
,使用 3B
更加麻烦。 - TemporalWolfi>>24 & 7
,但我认为用二进制写会更清晰明了。 - Anisi >> 30 & 0b111111
,对吗?这样可以获取第30、31、32、33、34和35位的比特。 - Aditya Salapaka最简单的方法是使用 & 运算符。使用 int(str_msg, 16)
将您的消息转换为整数。使用 bin(myint)
将整数转换为二进制字符串。
要获取字节中左侧第4-6位(从左往右数):
>> msg = int("10110111", 2) # or 0b10110111
>> extractor = int("00011100", 2) # or 0b10110111
>> result = msg & extractor
>> print bin(result)
00010100
result >> 2
进行位移。 显然,您会希望使这更加动态化,但这只是一个简化的示例。msg = 0b10110111
。你也可以用类似的方式处理十六进制,例如test = 0xFF
。在某些情况下,这样做可以使代码更易于理解。 - jacoblawint("...", 2)
的方式也不够高效,因为它是在运行时计算而不是编译时。这可能并不重要,但仍然是所有方面都更差。 - Stefan Pochmann