从 2 字节 big endian (motorola) bytearray 中提取 12 位整数
Extract 12-bit integer from 2 byte big endian (motorola) bytearray
我正在尝试提取一个整数,该整数在 2 字节(16 位)消息中最多占用 12 位,该消息采用 big-endian 格式。我已经做了一些研究,预计我将不得不使用 bit_manipulation(位移位)来实现这一点,但我不确定如何将其应用于大端格式。
这里的几个答案使用了 python 'Numpy' 包,但我无法在 Micropython 上访问它。我确实可以访问 'ustruct' 模块,我用它来解压缩消息的某些其他部分,但它似乎只适用于 8 位、16 位和 32 位消息。
到目前为止我唯一想到的是:
int12 = (byte1 << 4) + (byte2)
expected_value = int.from_bytes(int12)
但这并没有给我我期望的数字。例如 0x02,0x15
应该显示十进制 533 。
我哪里错了?
我不熟悉位操作和从字节中提取数据,因此非常感谢任何帮助,谢谢!
这应该有效:
import struct
val, _ = struct.unpack( '!h', b'23' )
val = (val >> 4) & 0xFFF
给出:
>>> hex(val)
'0x333'
但是,你应该检查16位中有12位被占用了。我之前的代码假定那些是前 3 个半字节。如果数字占用低 3 个半字节,则不需要任何移位,只需要带有 0xFFF
.
的掩码
我正在尝试提取一个整数,该整数在 2 字节(16 位)消息中最多占用 12 位,该消息采用 big-endian 格式。我已经做了一些研究,预计我将不得不使用 bit_manipulation(位移位)来实现这一点,但我不确定如何将其应用于大端格式。
这里的几个答案使用了 python 'Numpy' 包,但我无法在 Micropython 上访问它。我确实可以访问 'ustruct' 模块,我用它来解压缩消息的某些其他部分,但它似乎只适用于 8 位、16 位和 32 位消息。
到目前为止我唯一想到的是:
int12 = (byte1 << 4) + (byte2)
expected_value = int.from_bytes(int12)
但这并没有给我我期望的数字。例如 0x02,0x15
应该显示十进制 533 。
我哪里错了?
我不熟悉位操作和从字节中提取数据,因此非常感谢任何帮助,谢谢!
这应该有效:
import struct
val, _ = struct.unpack( '!h', b'23' )
val = (val >> 4) & 0xFFF
给出:
>>> hex(val)
'0x333'
但是,你应该检查16位中有12位被占用了。我之前的代码假定那些是前 3 个半字节。如果数字占用低 3 个半字节,则不需要任何移位,只需要带有 0xFFF
.