1

我有一个 bytestring "\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
>>>

有没有更清洁的方法?

4

3 回答 3

3

您似乎将数据解释为 little-endian。要解码,使用 解码struct,然后使用位移位和掩码来解释它们:

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
于 2012-10-12T07:04:14.487 回答
2

对于非整字节数据的二进制分析,像bitstring这样的外部模块可能会有所帮助(当事情变得比这更复杂时,它肯定会有所帮助):

>>> from bitstring import BitArray
>>> a = BitArray(bytes='\x20\x56')
>>> a.unpack('uint:4, uint:12')
[2, 86]
于 2012-10-12T07:06:15.237 回答
1
>>> import struct
>>> divmod(struct.unpack('<H', '\x56\x20')[0], 2 ** 12)
(2, 86)
于 2012-10-12T07:06:09.560 回答