2013-06-17 5 views
-1

мне нужно превратить строку как data = "00000111010110101" в шестнадцатеричной строки, в этом примере, мне нужно «075A80»Python: Как превратить строку двоичных значений (произвольную длину) в шестнадцатеричные данные?

Вы можете заметить несколько предостережений:

  • ведущие нули не должны быть зачищены так шестнадцатеричном (межд (данные, 2)) не работает для меня
  • если Len (данные)% 8! = 0 строки должна быть добавлена ​​с нулями до конца с полным байте

После поиска этого форума и взлома вместе разные ответы, это один путь, который я нашел для этого, но он кажется довольно сложным, и я надеюсь, что кто-то еще увидит гораздо более простой способ.

data_hex = "".join([ "%02X" % int("".join(a),2) for a in izip_longest(*(iter(data),)*8, fillvalue='0')]) 

Спасибо!

Редактировать: Некоторые фоне данных. Базовые данные являются чисто битами, они не представляют собой целое число или другое числовое значение, поэтому ведущие нули являются релевантными и должны быть представлены в результате. Также добавление нулей на (правом) конце не изменяет «значение» в моем случае использования.

+0

Кроме того, я могу использовать только Python 2.7. – DozyBrat

+0

'00000111010110101' bin - это' eb5' hex, поэтому я не уверен, как вы получите '075A80'. – JJJ

+0

'0x075A80' -' 1110101101010000000' в двоичном формате. Похоже, вам не хватает нулей с правой стороны. – Kevin

ответ

2

Вот один вариант:

>>> data = "00000111010110101" 
>>> new_data = data + '0' * ((8 - len(data)) % 8) 
>>> '{0:0{width}x}'.format(int(new_data, 2), width=len(new_data)/4) 
'075a80' 

Первая строка добавляет нули, так что длина кратна 8, а второй формат вашей шестнадцатеричной строки.

+0

Мне нравится этот ответ, я хотел избежать каких-либо условностей. Я также хотел, чтобы избежать предварительного форматирования, но я думаю, что это требует 2-го требования. Кроме того, этот ответ чисто относится к любому размеру ввода, с шириной в строке формата. Благодарю. – DozyBrat

+0

Любая причина% 8 выполняется (8 - len (data)), а не только (len (data) - 1)? – DozyBrat

+0

'(len (data) - 1)% 8' даст вам необходимое количество нулей ... –

1

0-подушечка ваш вход кратной 8, затем превратить его в шестнадцатиричное значение:

multiple, remainder = divmod(len(data), 8) 
if remainder: 
    data = format(data, '<0{}'.format((multiple + 1) * 8)) 
result = format(int(data, 2), '0{}x'.format((multiple + 1) * 2)) 

Выходной сигнал дополняется также, чтобы дать 2 шестнадцатеричных символов в полном байт.

Это дает:

>>> data = "00000111010110101" 
>>> multiple, remainder = divmod(len(data), 8) 
>>> if remainder: 
...  data = format(data, '<0{}'.format((multiple + 1) * 8)) 
... 
>>> format(int(data, 2), '0{}x'.format((multiple + 1) * 2)) 
'075a80' 

 Смежные вопросы

  • Нет связанных вопросов^_^