解码八位字节间二进制数据

时间:2012-10-12 06:53:46

标签: python binary

我有一个字节串"\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
>>>

有更清洁的方式吗?

3 个答案:

答案 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)