2015-12-09 4 views
3

У меня есть ряд как 0x5423, где я хочу, чтобы извлечь 4 значения:Извлечение битового определенного междунар в Python

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

Преобразование строки чтобы 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 

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 
Смежные вопросы