我有一个字节串"\x56\x20"
,它是两组数据,a(12位)和b(4位)。
解压缩的数据应该是:
a = 86 b = 2
其中:
a = int("056", 16)
b = int("2", 16)
我知道我可以使用binascii
将字节字符串转换为十六进制字符串,然后在其上处理切片魔术,但这看起来很混乱。
我看了struct
但是找不到分割出12位/ 4位的方法。
>>> import binascii
>>> two_octets = "\x56\x20"
>>> hex_str = binascii.hexlify(two_octets)
>>> temp_a, temp_b = hex_str[:2], hex_str[2:]
>>> a_part, b_part = reversed([c for c in temp_b])
>>> int(a_part + temp_a, 16)
86
>>> int(b_part, 16)
2
>>>
有更清洁的方式吗?
答案 0 :(得分:3)
您似乎将数据解释为little-endian。要解码,用struct
解码,然后使用bitshifting和掩码来解释它们:
import struct
two_octets = '\x56\x20'
values = struct.unpack('<H', two_octets)[0]
a = values & 0xFFF # Select right-most 12 bits
b = values >> 12 # Select left-most 4 bits
答案 1 :(得分:2)
对于非全字节数据的二进制分析,像bitstring这样的外部模块可能会有所帮助(当事情变得比这更复杂时,它肯定会有所帮助):
>>> from bitstring import BitArray
>>> a = BitArray(bytes='\x20\x56')
>>> a.unpack('uint:4, uint:12')
[2, 86]
答案 2 :(得分:1)
>>> import struct
>>> divmod(struct.unpack('<H', '\x56\x20')[0], 2 ** 12)
(2, 86)