1

"\x56\x20"a(12ビット)とb(4ビット)の2セットのデータであるバイトストリングがあります。

解凍されたデータは次のようになります。

a = 86 b = 2

どこ:

a = int("056", 16)
b = int("2", 16)

binasciiバイト文字列を16進文字列に変換してから、スライスマジックを実行するために 使用できることはわかっていますが、それは面倒なようです。

調べてみまし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

データをリトルエンディアンとして解釈しているようです。デコードするには、 でデコードして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 に答える