【问题标题】:Extract bitfields from an int in Python从 Python 中的 int 中提取位域
【发布时间】:2015-12-09 08:39:47
【问题描述】:

我有一个像 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)

【问题讨论】:

    标签: python bits bit-fields


    【解决方案1】:

    在传递给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
    

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 2017-10-22
      • 1970-01-01
      • 2017-10-16
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多