在Python中从整数中提取位字段

5
我有一个类似于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个回答

2

在传递给 bitstring.BitArray 之前,将字符串转换为 0x#### 格式:

>>> 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

更新另外一种不依赖于bitstring的解决方案,并按照从左边开始计数(根据原始发布者的要求):

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

>>> n = '0xA5423'
>>> n = format(int(n, 16), '016b')[::-1]  # reversed
>>> n
'11000100001010100101'
>>> int(n[0:2][::-1], 2)  # need to reverse again to get proper value
3
>>> int(n[2:4][::-1], 2)
0
>>> int(n[4:12][::-1], 2)
66
>>> int(n[12:16][::-1], 2)
5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接