从Python

时间:2015-12-09 08:39:48

标签: python bits bit-fields

我有一个像0x5423这样的数字,我想要提取4个值:

a = 0x5   # 15 downto 12
b = 0x42  # 11 downto 3
c = 0x3   # 3 downto 2
d = 0x00  # 1 downto 0

我发现模块bitstrings看起来很棒。不幸的是,由于未知原因,这些位从右侧开始编号。

这很糟糕,因为如果添加一些高位如0xA5423我的提取将不再起作用:

field = bitstrings.BitArray('0x5423')
a = field[0:4].uint
b = field[4:12].uint
c = field[12:14].uint
d = field[14:16].uint

如何在没有复杂算术处理的情况下正确提取我的位域,例如:

b = (a >> 4) & 0xFF

理想情况下我会:

b = field.range(11, 4)

1 个答案:

答案 0 :(得分:1)

在传递给rowCount之前将字符串转换为0x####格式:

bitstring.BitArray

更新另一种不依赖>>> n = '0xA5423' >>> n = '0x{:04x}'.format(int(n, 16) & 0xffff) # => '0x5423' >>> field = bitstring.BitArray(n) >>> field[0:4].uint 5 >>> field[4:12].uint # 0x42 == 66 66 >>> field[12:14].uint 0 >>> field[14:16].uint 3 的解决方案,并从左侧开始计数(根据OP):

将数字转换为二进制格式:

bitstring