从 Python 中的 int 中提取位域
Extract bitfields from an int in Python
我有一个像 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)
在传递给 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
UPDATE 另一个不依赖于 bitstring
的解决方案,从左数(根据 OP):
将数字转换为二进制格式:
>>> 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
我有一个像 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)
在传递给 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
UPDATE 另一个不依赖于 bitstring
的解决方案,从左数(根据 OP):
将数字转换为二进制格式:
>>> 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