Преобразование hex в bin внутри массива в python 3

1

Я работаю над Visual Studio о Python Project. У меня есть массив и пользовательский ввод для преобразования hex в dec и dec в bin. Я использую оба из них в моем проекте (hex, dec, bin). Вот базовая выборка моего кода:

dynamicArrayBin = [ ]
dynamicArrayHex = [ ] 
hexdec = input("Enter the hex number to binary "); 
dynamicArrayHex = [hexdec[idx:idx+2]  for idx in range(len(hexdec)) if idx%2 == 0]
binary = '{:08b}'.format(int(dynamicArrayHex[0] , 16))

Итак, когда пользователь вводит 01 для ввода, код дает 00000001. Я хочу отделить этот результат от элементов 0 0 0 0 0 0 0 1 и поместить в dynamicArrayBin=[]. Через некоторое время, когда я вызову dynamicArrayBin=[0], он должен показать 0.

Есть ли способ сделать это?

  • 1
    Вы можете перебирать строку, чтобы получать ее символы один за другим.
  • 0
    Ах, вы хотите выделить биты всех шестнадцатеричных входов. Вам даже не нужно разбивать строку hexdec на отдельные цифры.
Показать ещё 3 комментария
Теги:
python-3.x

2 ответа

2
Лучший ответ

Если вам нужен список двоичных цифр для шестнадцатеричного ввода, нет необходимости сначала разделять входные данные на байты (что и делает ваш код в настоящее время, преобразовывать каждые 2 символа шестнадцатеричного ввода в целое число, охватывающее диапазон 0-255).

Просто преобразуйте весь шестнадцатеричный ввод в целое число и отформатируйте его в двоичном виде:

integer_value = int(hexdec, 16)
byte_length = (len(hexdec) + 1) // 2  # to help format the output binary
binary_representation = format(integer_value, '0{}b'.format(byte_length * 8))

Значение binary_representation представляет собой строку из символов '0' и '1', а поскольку строки являются последовательностями, нет необходимости превращать их в список, если вы не должны мутировать отдельные символы.

Так:

print(binary_representation[0])

работает и печатает 0 или 1.

Если у вас есть список, вы можете сделать это со list(binary_representation)).

Демо-версия:

>>> hexdec = 'deadbeef'  # 4 bytes, or 32 bits
>>> integer_value = int(hexdec, 16)
>>> byte_length = (len(hexdec) + 1) // 2  # to help format the output binary
>>> binary_representation = format(integer_value, '0{}b'.format(byte_length * 8))
>>> integer_value
3735928559
>>> byte_length
4
>>> binary_representation
'11011110101011011011111011101111'
>>> binary_representation[4]
'1'
>>> binary_representation[2]
'0'
>>> list(binary_representation)
['1', '1', '0', '1', '1', '1', '1', '0', '1', '0', '1', '0', '1', '1', '0', '1', '1', '0', '1', '1', '1', '1', '1', '0', '1', '1', '1', '0', '1', '1', '1', '1']

Если все, что вы хотели, было первым битом шестнадцатеричного значения, то есть более быстрый метод:

if len(hexdec) % 2:  # odd number of hex characters, needs a leading 0
    hexdec = '0'     # doesn't matter what the rest of the hex value is
print('1' if hexdec[0].lower() in '89abcdef' else '0')

потому что первые 4 бита двоичного представления полностью определяются первым шестнадцатеричным символом, а самый первый бит установлен для шестнадцатеричных значений от 8 до F

  • 0
    Ребята, спасибо за ваши усилия и помощь мне. Однако это не то, что я хочу, я решил проблему, если вы скопируете свой ответ, другие люди могут получить решение.
  • 0
    Просто добавьте после моего кода: dynamicArrayBin = [binary[i:i+1] for i in range(len(binary)) if i%1 == 0] print(int(dynamicArrayBin[0],16)) Результат - это то, что я хочу
Показать ещё 4 комментария
0

Вы можете сделать что-то вроде ниже

hexLst = ['ABC123EFFF', 'ABC123EFEF', 'ABC123EEFF']
binLst = [bin(int(n, 16))[2:] for n in hexLst]
print(binLst)

Что даст вам результат

['1010101111000001001000111110111111111111', '1010101111000001001000111110111111101111', '1010101111000001001000111110111011111111']

то вы можете составить список из этого

dynamicArrayBin=[list(b) for b in binLst]
print(dynamicArrayBin)

Выход

[['1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '1', '1', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1'], ['1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '1', '1', '1', '0', '1', '1', '1', '1', '1', '1', '1', '0', '1', '1', '1', '1'], ['1', '0', '1', '0', '1', '0', '1', '1', '1', '1', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '1', '1', '1', '0', '1', '1', '1', '0', '1', '1', '1', '1', '1', '1', '1', '1']]
  • 0
    Прежде всего, спасибо за ваши усилия и помощь мне, но это был не мой ответ. Я решил, можете ли вы отредактировать свой ответ: просто напишите после моего кода: dynamicArrayBin = [binary[i:i+1] for i in range(len(binary)) if i%1 == 0] print(int(dynamicArrayBin[0],16)) . Результат чего я хочу. Тогда другие ребята смогут понять результат.
  • 0
    Хорошо @ Asell, но лучше сделать dynamicArrayBin = [binary[i:i+1] for i in range(len(binary)) if i%1 == 0] как просто dynamicArrayBin = [[i] for i in binary]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню